Qt多线程多客户端TCP服务器套接字 - > write()问题

时间:2016-03-10 21:00:06

标签: c++ multithreading qt sockets tcp

我的TCP服务器有一个Qt GUI /控制台应用程序。服务器有一个线程数组,每个线程包含与不同客户端的连接。

如果您之前已经完成了多线程TCP服务器,那么您可能已经看到了一个带有运行函数的客户端线程。

    void ClientThread::run()
{

    //thread starts here
    socket = new QTcpSocket();
    if(!socket->setSocketDescriptor(this->socketDescriptor))
    {
        emit error(socket->error());
        return;
    }

    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()),Qt::DirectConnection);
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()),Qt::DirectConnection);
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()),Qt::DirectConnection);

    qDebug() << socketDescriptor << " Client Connected";
    emit threadDataOut(QString::number(socketDescriptor) + " Client Connected");

    exec();
}

使用readRead()函数,我会假设从readyRead()QTcpSocket SIGNAL接收的ClientThread SLOT。

void ClientThread::readyRead()
{
    QByteArray Data = socket->readAll();

     qDebug() << socketDescriptor << "Recived: " << Data;

     //send data on to be displayed on GUI
     emit threadDataOut(Data);

     //Echo data back to client for testing purposes
     socket->write(Data);
}

收到数据并回复没有问题。

但是我想只将从用户界面传递到服务器的数据发送到客户端线程到ClientThread :: transmit(QByteArray Data)SLOT函数。

void ClientThread::transmit(QByteArray Data)
{
    qDebug()<<"Sent: "<< Data <<" to "<< this->socketDescriptor;

    socket->write(Data);
}

因此正确的客户端会收到数据/消息,但服务器会给出错误

QObject:无法为不同线程中的父级创建子级。 (Parent是QNativeSocketEngine(0x1b83e520),父线程是ClientThread(0x1b840da0),当前线程是QThread(0x983390)

从此时起,服务器无法接收该特定客户端发送的任何数据。由于某种原因,连接继续在另一个方向上工作。

但是,如果向该客户端发送另一条数据消息,则客户端会收到两次,如果第三次发送另一条数据消息,则客户端会收到消息3次等。

有谁可以解释这里可能发生的事情?更重要的是什么是合适的解决方案?

注意:我一直在使用本地环回127.0.0.1上的telnet客户端在Windows计算机上进行测试 我暂时没有发布我的所有代码,因为我相信这个问题在我迄今给出的内容中很明显。

0 个答案:

没有答案