将线程TcpServer上的信息从一个线程传递到另一个线程

passing information on Threaded TcpServer from one thread to another

本文关键字:线程 一个 另一个 TcpServer 信息      更新时间:2023-10-16

我尝试创建类似链接1中的简单服务器。Youtube教程创建多线程服务器

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。为此,我制作了指向MyThreads的QMap到存储指针。当从客户端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(指针1),父线程是>(指针2),当前线程为(指针3);

QSocketNotificationer:无法从另一个线程启用或禁用套接字通知程序。

我的问题是:如何正确地将数据从客户端1传递到服务器,然后再传递到客户端2?我已经做了研究,问题在于正确使用信号和插槽,但我找不到如何以正确的方式做到这一点。

Test_Thread::write_data没有在创建套接字的同一线程上运行,即Test_Thread::run()。在QThread类中,只有在run方法上运行的内容在单独的线程上运行。

我终于解决了这个问题。为了做到这一点,我遵循了这里描述的类似问题解决方案:问题&解决方案我已经辞职使用MyThread类,而是创建了Worker类,并将其移动到下面这样的线程:

void Test_Server::incomingConnection(int socketDescriptor_)
{
    qDebug() << "void Test_Server::incomingConnection current thread: " << QThread::currentThread();
    qDebug() << socketDescriptor_ << "connecting...";
    Socket_map_.insert(number_,QByteArray::number(socketDescriptor_));
    QThread *thread_= new QThread;
    qDebug() << "void Test_Server::incomingConnection new thread_: " << thread_->thread();
    Test_Worker *worker = new Test_Worker(socketDescriptor_);
    worker->moveToThread(thread_);
    connect(thread_,SIGNAL(started()),worker,SLOT(create_socket_()));
    connect(this,SIGNAL(pass_socket_descriptor_(int)),worker,SLOT(set_socket_descriptor_(int)));
    connect(worker,SIGNAL(finished()),thread_,SLOT(quit()));
    connect(worker,SIGNAL(finished()),worker,SLOT(deleteLater()));
    connect(thread_,SIGNAL(finished()),thread_,SLOT(deleteLater()));
    connect(worker,SIGNAL(pass_data_to_server_(QByteArray,QByteArray)),this,SLOT(data_from_socket_(QByteArray,QByteArray)));
    connect(this,SIGNAL(pass_data_to_client_(QByteArray,QByteArray)),worker,SLOT(show_data_received_from_server_(QByteArray,QByteArray)));
    number_++;
    thread_->start();
}

提示:当我通过testrongerver信号create_socket_(int)创建套接字时和socketcreate_socket(int),程序无法正常工作。修复将信号从启动线程连接到套接字-create_socket_

程序现在成功地从客户端1接收数据并将其传递给客户端2,没有出现错误。