Qt如何实现tcp通信?(二)
在《Qt如何实现tcp通信》?中说到服务端获取与客户端连上的socket是通过连接QTcpServer的newConnection信号,然后在对应的槽函数中使用nextPendingConnection获取socket指针就可以通信了。
除了上述方法外,还有一种方法:
1. 新建一个类,继承至QTcpServer。
2. 重写void incomingConnection(qintptr handle)函数。
3. 在incomingConnection中创建一个socket。设置socket描述符为handle(socket->setSocketDescriptor(handle))。
4.使用socket与客户端通信。
例:
void MyServer::incomingConnection(qintptr handle) { QTcpSocket* socket = new QTcpSocket; socket->setSocketDescriptor(handle); socket->write("hello"); }
MyServer继承至QTcpServer,在incomingConnection中创建一个QTcpSocket,然后调用socket的setSocketDescriptor函数,传入handle。接着就可以给客户端socket发送数据了。
如果此时也连接newConnection信号,会发现在槽函数中通过nextPendingConnection获取的socket是空的。实际上新连接中的socket就是在incomingConnection中创建的。QTcpServer源码中incomingConnection的实现如下:
void QTcpServer::incomingConnection(qintptr socketDescriptor) { #if defined (QTCPSERVER_DEBUG) qDebug("QTcpServer::incomingConnection(%i)", socketDescriptor); #endif QTcpSocket *socket = new QTcpSocket(this); socket->setSocketDescriptor(socketDescriptor); addPendingConnection(socket); }
可以看到主要步骤和我们写的incomingConnection差不多,就多了一步addPendingConnection。既然这样那为什么还要重写这个函数呢?。其实有一点可以看到,默认的socket都是创建在主线程中的,我们想要在子线程处理网络操作就没办法了。而重写这个函数,得到handle可以在子线程中创建socket,socket自己创建自己管理主动权在手也能玩出更多的花样。
相关文章: