Mind Map Gallery Work with QTcpSocket
无数据
QTcpSocket works asynchronously and emits signals to report status changes and errors, just like QNetworkAccessManager.
Edited at 2020-10-10 05:51:10Work with QTcpSocket
bool QTcpServer::listen(const QHostAddress &address, quint16 port)
…
bool QTcpServer::waitForNewConnection(int msec, bool *timedOut)
QTcpServerPrivate::readNotification()
QTcpServer::incomingConnection(int socketDescriptor)
QTcpSocket *socket = new QTcpSocket(this);
QTcpSocket создается в основном потоке! Не подходит для многопоточных приложений или использовать socket->moveToThread(this), но в описании есть The object cannot be moved if it has a parent. Так что…
socket->setSocketDescriptor(socketDescriptor);
d_func()->pendingConnections.append(socket);
Удаляется в QTcpSocket *QTcpServer::nextPendingConnection()
emit newConnection()
newConnection
constructor myTcpServer::myTcpServer
connect(myTcpServer, SIGNAL(newConnection()), myTcpServer, SLOT(connectionProcess()));
void myTcpServer::connectionProcess()
QTcpSocket *clientConnection = myTcpServer->nextPendingConnection();
connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));
Не нужно если бы сделали так: QTcpSocket tcpSocket
clientConnection->read(…);
clientConnection->write(…);
clientConnection->disconnectFromHost();
Reimplement incomingConnection(int socketDescriptor)
Этот способ хорошо для многопоточных приложений, так как QTcpSocket создается в контексте рабочего потока
void myTcpServer::incomingConnection(int socketDescriptor)
1. Обработка соединения
1.1. QTcpSocket tcpSocket;
1.2. tcpSocket.setSocketDescriptor(socketDescriptor)
1.3. clientConnection->read(…);
1.4. clientConnection->write(…);
1.5. clientConnection->disconnectFromHost();
1.6. tcpSocket.waitForDisconnected();
Если это не основной поток, для того чтобы поток не успел разрушиться, потому что для завершения работы QTcpSocket нужна его очередь сообщений Также так как QTcpSocket tcpSocket указан не как указатель, то он просто быстро разрушается, при выходе из функции
2. Создаем новый поток