Qt如何实现tcp通信?(二)

2017-10-17 22:08:07  阅读 227 次 评论 0 条

    在《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自己创建自己管理主动权在手也能玩出更多的花样。

    

 相关文章:

 Qt如何实现tcp通信?(三)   

本文地址:http://fearlazy.com/index.php/post/36.html
版权声明:本文为原创文章,版权归 fearlazy 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?