Многопоточный сервер не может читать сообщения от клиентов в Qt

Пытаясь реализовать многопоточный сервер в Qt, просто подумайте об этом:

в классе SocketThread:

SocketThread::SocketThread(qintptr descriptor, QObject *parent)
    : QThread(parent), socketDescriptor(descriptor)
{
    socket = new QTcpSocket();
    socket->setSocketDescriptor(socketDescriptor);

    socket->moveToThread(this);

    connect(socket, &QTcpSocket::readyRead, [this]() { qDebug() << socket->readAll(); }); //trying to read messages from clients
} 

в классе подключения: создание потока вincomingConnection()

void Connection::incomingConnection(qintptr socketDescriptor)
{
    SocketThread *socketThread = new SocketThread(socketDescriptor);
    socketThread->start();

    connect(socketThread, &SocketThread::started, [&]() { socketThread->socket->write("Hello!"); });  //write a message to client when thread is created
}

Странная вещь, если я добавлю эту строку:

connect (socketThread, & SocketThread:: start, & { socketThread->socket->write("Hello!"); }); // написать сообщение клиенту при создании потока

Тогда сокет не будет читать сообщения от клиента. Если я удалю эту строку, сокет будет читать сообщение от клиента.

Я хочу, чтобы сервер отправлял сообщение клиенту при создании потока, а также считывал сообщение с клиента. Как можно решить проблему?

Редактировать:

Заголовочный файл SocketThread:

class SocketThread : public QThread
{
    Q_OBJECT
public:
    SocketThread(qintptr descriptor, QObject *parent = 0);
    ~SocketThread();
    QTcpSocket *socket;
    qintptr socketDescriptor;
};

в конструкторе Connection:

Connection::Connection(QObject *parent) : QTcpServer(parent)
{
    this->listen(QHostAddress::Any, 6666);
}

И создание объекта подключения в main.cpp файл. Это действительно похоже на весь код.

0 ответов

Другие вопросы по тегам