QT 之 TCP 服务端 连接 多客户端 处理学习
【QT 之 TCP 服务端 连接 多客户端 处理学习】自学QT中, 在此记录一下TCP多链接的方法。
跟着 “Qt Creator快速入门” 学了一段时间了,刚接触网络编程, 例子中仅仅简单的 用 客户端 连接了一下 服务端, 然后 服务端发送了一条信息就关闭了, 感觉太简单, 无法实际应用到项目中, 于是查找了下资料, 编写了一个多连接的 服务端, 监听本机第一个 ipv4的地址, 端口号固定为 9011,程序做的只是简单的 打印客户端的IP 及数据 , 在收到的数据前面添加几个字符 原路发送回去。客户端就不贴了, 比较简单, 测试可用使用sscom 最新版进行。代码-头文件如下:
#ifndef SERVER_H
#define SERVER_H#include
#include class QTcpServer;
class QTcpSocket;
namespace Ui {
class Server;
}class Server : public QDialog
{
Q_OBJECTpublic:
explicit Server(QWidget *parent = 0);
~Server();
protected slots:
void socketRead(void);
private:
Ui::Server *ui;
QTcpServer *tcpServer;
QList tcpSockets;
private slots:
void newConnect();
void deleteSocket();
};
#endif // SERVER_H
代码-c++文件如下:
#include "server.h"
#include "ui_server.h"
#include
#include Server::Server(QWidget *parent) :
QDialog(parent),
ui(new Ui::Server)
{
ui->setupUi(this);
QHostAddress addr;
//IPv4地址(可能有多条)
QHostInfo info= QHostInfo::fromName(QHostInfo::localHostName());
qDebug()<<"IP Addr:"<< info.addresses();
foreach(QHostAddress address, info.addresses())
{
if(address.protocol() == QAbstractSocket::IPv4Protocol)
{
addr = address;
//qDebug() <<"IPv4 addr: "<< address.toString();
ui->label->setText("Listen:" +address.toString() + ":9011");
break;
}
}tcpServer = new QTcpServer(this);
//QHostAddress("127.0.0.1")
if (!tcpServer->listen(addr, 9011))
{
qDebug() << tcpServer->errorString();
close();
}
connect(tcpServer, &QTcpServer::newConnection,
this, &Server::newConnect);
}Server::~Server()
{
delete ui;
}void Server::newConnect()
{
// 获取已经建立的连接的套接字
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
// 放入 QList
tcpSockets.append(clientConnection);
ui->textBrowser->append("NewClient:" + clientConnection->peerAddress().toString());
// 数据就绪信号 到 自定义 读槽函数
QObject::connect(clientConnection, &QTcpSocket::readyRead, this, &Server::socketRead);
// 断开连接后 从QList中删除, 并删除套接字
connect(clientConnection, &QTcpSocket::disconnected, this, &Server::deleteSocket);
qDebug()<<"cli Num:"<state() == QTcpSocket::UnconnectedState)
{
qDebug()deleteLater();
tcpSockets.removeAt(i);
//tcpSockets.removeOne(soc);
}
i++;
qDebug()<<"i:"<bytesAvailable() > 0)
{
strs = soc->readAll();
strs.insert(0, QString("S rec:"));
soc->write(strs);
}}
ui->textBrowser->append("recNum:"+QString::number(strs.size()-6));
ui->textBrowser->append(strs);
}
server.ui 文件内容如下
Server
0
0
412
433
Server
20
30
201
31
等待连接!
10
80
381
331
截图:
文章图片
推荐阅读
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天