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

2017-10-20 22:50:37  阅读 265 次 评论 0 条

    在《Qt如何实现tcp通信?(三)》想通过继承QThread方式实现多线程tcpserver的计划失败了,得另想个办法。我们需要让socket在子线程中,同时socket通信的函数也在同一个线程中。能符合这两个条件的,容易想到的就是moveToThread了。moveToThread是从QObject就有的一个函数,它提供了一种实现多线程的方法。将一个QObject通过moveToThread函数移动到一个线程中,这个QObject的槽函数会在该线程中执行。根据这些有思路:

    1.新建一个ServerSocket类继承于QTcpSocket。

    2.在QTcpServer的incomingConnection中创建ServerSocket对象时,将这个socket对象move到一个线程中(moveToThread)。

    3.连接ServerSocket的readyRead信号到ServerSocket的一个槽函数中。

    

    测试:

    incomingConnection函数:

void MyServer::incomingConnection(qintptr handle)
{
    ServerSocket* socket = new ServerSocket(handle);
}

    ServerSocket的主要函数:

ServerSocket::ServerSocket(qintptr handle,QObject *parent):QTcpSocket(parent)
{
    setSocketDescriptor(handle);
    connect(this,SIGNAL(readyRead()),this,SLOT(slotReadyRead()));

    m_thread = new QThread(this);
    this->moveToThread(m_thread);
    m_thread->start();
}
void ServerSocket::slotReadyRead()
{
    qDebug()<<"readyRead-->"<<QString(readAll())<<QThread::currentThread()<<this->thread();
}

    和思路上写的有所不同的是这里将线程对象作为了ServerSocket的成员变量了,所以incomingConnection中就只创建了一个ServerSocket的对象。

    在ServerSocket的构造函数中执行了setSocketDescriptor、连接readyRead信号以及将自己移动到m_thread线程中等操作。

    readRead对应槽函数中打印了收到的内容和该函数所在线程以及该对象所在线程,在这之前还先打印了主线程。

    为了测试,客户端程序添加了一个编辑框和一个按钮,按下按钮发送输入的内容到服务端。测试结果:

    blob.png

main thread---> QThread(0x221029b4e00)

readyRead--> "hello" QThread(0x221029a6430) QThread(0x221029a6430)

readyRead--> "good server" QThread(0x22102a22f60) QThread(0x22102a22f60)

readyRead--> "nice server" QThread(0x22102a22fb0) QThread(0x22102a22fb0)

    我们启动了三个客户端,发送了不同的内容。服务端在三个线程中处理了处理了这些内容。我们可以看到readyRead和socket在一个线程中,若在readyRead中直接write一个数据给客户端,也不会出现上一篇中出现的那个错误。如:

void ServerSocket::slotReadyRead()
{
    qDebug()<<"readyRead-->"<<QString(readAll())<<QThread::currentThread()<<this->thread();
    write("hello client");
}

Starting F:\Test\build-Client-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug\debug\Client.exe...    

readRead "hello client"

    

    

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

发表评论


表情

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