Многопоточный сервер не может читать сообщения от клиентов в 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
файл. Это действительно похоже на весь код.