【发布时间】:2016-09-09 23:34:40
【问题描述】:
我尝试像链接 1 那样创建简单的服务器。 Youtube tutorial to create multithreaded server
void Test_Server::incomingConnection(int socketDescriptor_)
{
qDebug() << socketDescriptor_ << "connecting...";
Test_Thread *thread_ = new Test_Thread(number_,socketDescriptor_,this);
connect(thread_,SIGNAL(finished()),thread_,SLOT(deleteLater()));
thread_->start();
number_++;
}
////
void Test_Thread::run()
{
qDebug() << this->Socket_Descriptor_ << "starting thread";
socket = new QTcpSocket();
if(!socket->setSocketDescriptor(Socket_Descriptor_))
{
qDebug() << "ERROR";
}
connect(socket,SIGNAL(readyRead()),this,SLOT(Ready_read_()),Qt::DirectConnection);
connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected_()),Qt::DirectConnection);
qDebug() << this->Socket_Descriptor_ << "Client connected";
QByteArray name = QByteArray::number(number_);
server_->Socket_map_.insert(name,this);
server_->show_all_connected_sockets_();
exec();
}
我的目标是将两个客户端连接到服务器(我使用 telnet),从客户端 1 向服务器写入内容,服务器应该将数据传递给客户端 2。 为此,我制作了 QMap 来存储指向 MyThreads 的指针。当从客户端 1 收到数据时,我正在调用方法:
void Test_Server::write_to_client_(int number, QByteArray data)
{
QByteArray name = QByteArray::number(number);
Test_Thread *pointer;
pointer = client_socket_(name);
connect(this,SIGNAL(send_data_(QByteArray)),pointer,SLOT(write_data_(QByteArray)));
emit send_data_(data);
disconnect(this,SIGNAL(send_data_(QByteArray)),pointer,SLOT(write_data_(QByteArray)));
qDebug() << "void Test_Server::write_to_client_(int number, QByteArray data): data sent";
}
////
void Test_Thread::write_data_(QByteArray data) const
{
socket->write(data);
socket->waitForBytesWritten();
}
通常传递信息有效,我在客户端 1 中写入一些数据,客户端 2 显示它,但是我得到了:
TQObject:无法为不同的父级创建子级 线程。
父Test_Thread是QNativeSocketEngine(Pointer 1),父线程是>(Pointer 2),当前线程是(Pointer 3);
QsocketNotifier:不能从另一个线程启用或禁用套接字通知器。
我的问题是:如何正确地将数据从客户端 1 传递到服务器,然后再传递到客户端 2?我已经进行了研究,问题在于正确使用信号和插槽,但我不知道如何以正确的方式进行。
【问题讨论】:
-
我不确定代码的相关部分(导致错误的部分)是否在您发布的代码中。
-
@perencia in 'Test_Server::write_to_client_(int number, QByteArray data)' 有很多带有信息的 qDebug() 通道,我在发出信号后收到错误。 write_data_SLOT 是用 2 lane 代码实现的,socket->write(data);和 socket->waitforBytesWritten();
-
我想说的问题是套接字是在主线程中创建的,而您正试图在第二个线程上使用它的 QSocketNotifier,它具有不同的事件循环。
socket如何到达 Test_Thread ?你是从主线程传递的吗? -
@perencia 在 Server::incomingConnection 中创建线程,然后在线程启动后,在 Thread::run() 中创建套接字。我已将 Thread::run() 的代码添加到 question
-
我和你差不多有same problem,你能帮我看看吗?
标签: c++ multithreading qt tcp server