我的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计算机上进行测试 我暂时没有发布我的所有代码,因为我相信这个问题在我迄今给出的内容中很明显。