手机网站一般多宽,网站怎么吸引流量,dedecms做模板网站,网易企业邮箱登录v简介 
软件开发中#xff0c;可能经常会用到TCP调试工具。本人使用QT开发了一款TCP调试工具#xff0c;方便大家使用。本文章主要介绍下#xff0c;该工具的功能#xff0c;以及如何在Qt中实现TCP服务器的并发。 
界面展示 
安装界面 桌面图标。安装后会生成桌面图标#…简介 
软件开发中可能经常会用到TCP调试工具。本人使用QT开发了一款TCP调试工具方便大家使用。本文章主要介绍下该工具的功能以及如何在Qt中实现TCP服务器的并发。 
界面展示 
安装界面 桌面图标。安装后会生成桌面图标双击图标可以打开程序。 界面展示  
功能说明 
本程序使用Qt实现了TCP客户端和服务端服务端并发数默认为100可配置。客户端连接后可以在服务端看到连接的客户端信息服务端可以指定给某一个客户端发送消息。服务端不支持广播后续版本会完善。 
软件下载 
本程序已经制作成安装包形式下载安装后可直接使用。gitee下载CSDN资源下载 
Qt实现服务端并发 
Qt实现服务端多并发时可以实现一个类 TcpServerTools该类需要继承于 QTcpServer然后重写以下两个函数void setMaxPendingConnections(int numConnections) 该函数设置服务端最大连接数 void incomingConnection(qintptr socketDescriptor); 当有新连接时会触发该函数我们需要在该函数中将套接字保存起来。可以将套接字保存到一个Hash中 QHashint, TcpSocketTools*  
核心源代码 这里只提供了服务端实现并发的核心源代码主要有三个文件 networkdebugtools.cpp 为主界面文件实现UI交互。tcpservertools.cpp 主要实现接受客户端连接请求保存套接字到hash容器中。tcpsockettools.cpp 中主要实现处理客户端数据和断开请求。  三者之间可以自己定义信号槽实现通信整体源代码不提供请谅解。  networkdebugtools.h    #ifndef NETWORKDEBUGTOOLS_H#define NETWORKDEBUGTOOLS_H#include QWidget#include QEvent#include QMouseEvent#include QMenu#include tcpservertools.h#include mapQT_BEGIN_NAMESPACEnamespace Ui { class NetworkDebugTools; }QT_END_NAMESPACEclass NetworkDebugTools : public QWidget{Q_OBJECTpublic:NetworkDebugTools(QWidget *parent  nullptr);~NetworkDebugTools();private slots:void on_pushButton_send_clicked();void on_pushButton_listen_clicked();private:Ui::NetworkDebugTools *ui;TcpServerTools *mTcpServerTools;};#endif // NETWORKDEBUGTOOLS_Hnetworkdebugtools.cpp    #include networkdebugtools.h#include ui_networkdebugtools.h#include QMessageBox#include QHostInfo#include QTableWidgetItemNetworkDebugTools::NetworkDebugTools(QWidget *parent): QWidget(parent), ui(new Ui::NetworkDebugTools){ui-setupUi(this);mTcpServerTools  new TcpServerTools();}void NetworkDebugTools::on_pushButton_send_clicked(){//获取当前选中的客户端信息QString curAddr  ui-tableWidget_clientInfo-item(curRow, 0)-text();QHashint, TcpSocketTools*::iterator iter  mTcpServerTools-tcpClient-begin();for (; iter ! mTcpServerTools-tcpClient-end(); iter) {QString iterAddr  iter.value()-peerAddress().toString()  :  QString::number(iter.value()-peerPort());if (iterAddr.compare(curAddr)  0) {//这里hash容器tcpClient中保存的value就是socket可以直接通过socket给客户端发送数据//同样可以通过该socket获取客户端的ip和端口然后与我们点击的客户端信息比对就可以实现对指定客户端发送消息iter.value()-write(ui-plainTextEdit_send-toPlainText().toLocal8Bit());break;}}}void NetworkDebugTools::on_pushButton_listen_clicked(){if (ui-pushButton_listen-text().compare(监听)  0) {ui-pushButton_listen-setText(关闭);mTcpServerTools-setMaxPendingConnections(mConfigTools-getConnCount());mTcpServerTools-startListen();}else {ui-pushButton_listen-setText(监听);mTcpServerTools-closeConnect();}}tcpservertools.h    #ifndef TCPSERVERTOOLS_H#define TCPSERVERTOOLS_H#include QWidget#include QTcpServer#include QHostInfo#include QAbstractSocket#include QTcpSocket#include tcpsockettools.h#define THREAD_MAX 20class TcpServerTools : public QTcpServer{Q_OBJECTpublic:explicit TcpServerTools(QTcpServer *parent  0);~TcpServerTools();//开始监听bool startListen();//关闭连接void closeConnect();//设置最大连接数void setMaxPendingConnections(int numConnections);protected:// 有新连接到来时该函数会被触发void incomingConnection(qintptr socketDescriptor);private:QTcpServer *mTcpServer;   //tcp服务对象public:QHashint, TcpSocketTools* *tcpClient;// 该对象中保存套接字};#endif // TCPSERVERTOOLS_Htcpservertools.cpp    #include tcpservertools.hTcpServerTools::TcpServerTools(QTcpServer *parent) : QTcpServer(parent){tcpClient  new  QHashint, TcpSocketTools*;}TcpServerTools::~TcpServerTools(){}bool TcpServerTools::startListen() {//监听连接this-listen(QHostAddress(mIp), mPort.toInt());return true;}void TcpServerTools::closeConnect(){// 断开连接时删除tcpClient中保存的套接字并清除 tcpClientQHashint, TcpSocketTools*::const_iterator iterC  tcpClient-constBegin();for (; iterC ! tcpClient-constEnd(); iterC){iterC.value()-deleteLater();}tcpClient-clear();this-close();}void TcpServerTools::incomingConnection(qintptr socketDescriptor) {//创建 TcpSocketTools 对象TcpSocketTools *socketTools  new TcpSocketTools(socketDescriptor);	QString connAddr  socketTools-peerAddress().toString()  :  QString::number(socketTools-peerPort());// 有新连接时保存socket到 QHashint, TcpSocketTools* 类型的tcpClient指针对象中tcpClient-insert(socketDescriptor, socketTools);}// 设置最大连接数void TcpServerTools::setMaxPendingConnections(int numConnections) {QTcpServer::setMaxPendingConnections(numConnections);}tcpsockettools.h    #ifndef TCPSOCKETTOOLS_H#define TCPSOCKETTOOLS_H#include QTcpSocketclass TcpSocketTools : public QTcpSocket{Q_OBJECTpublic:explicit TcpSocketTools(qintptr socketDescriptor, QTcpSocket *parent  0);~TcpSocketTools();public slots :void onReadyRead();void onDisconnected();private:qintptr socketID;};#endif // TCPSOCKETTOOLS_Htcpsockettools.cpp    #include tcpsockettools.h#include QHostAddressTcpSocketTools::TcpSocketTools(qintptr socketDescriptor, QTcpSocket *parent) : QTcpSocket(parent),socketID(socketDescriptor){this-setSocketDescriptor(socketDescriptor);connect(this, TcpSocketTools::readyRead, this, TcpSocketTools::onReadyRead);connect(this, TcpSocketTools::disconnected, this, TcpSocketTools::onDisconnected);}TcpSocketTools::~TcpSocketTools(){}void TcpSocketTools::onReadyRead() {//处理接受到的数据}	void TcpSocketTools::onDisconnected() {//处理断开连接请求}