次のコードを使用して、サーバー側でQTcpServerのincomingConnection関数をオーバーロードしました
void CtiServer::incomingConnection(int socketDescriptor)
{
qDebug() << QString("CtiServer thread id = %1, thread = %2").arg(QString::number((uint)QThread::currentThreadId(), 16)).arg(QString::number((qlonglong)QThread::currentThread(), 16));
ServerThread *thread = new ServerThread(socketDescriptor, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}
次に、すべてのスレッドで、ServerSocket という名前の新しい QTcpSocket サブクラス オブジェクトを作成しました。
void ServerThread::run()
{
qDebug() << QString("ServerThread thread id = %1, thread = %2").arg(QString::number((uint)QThread::currentThreadId(), 16)).arg(QString::number((qlonglong)QThread::currentThread(), 16));
serverSocket = new ServerSocket();
serverSocket->setSocketDescriptor(socketDescriptor);
connect(serverSocket, SIGNAL(readyRead()), serverSocket, SLOT(handleRequest()));
serverSocket->waitForDisconnected(-1);
}
問題はserverSocket->waitForDisconnected(-1)
正しいかどうかです。
私はこのステートメントでソケットを維持しようとしています.util client send some message to notify the server socket that the connection should shut down.これにより、サーバーとクライアント間の長い接続を維持できます。
その結果、切断された信号を接続して、クライアントがまだ生きているか死んでいるかを検出するためのハートビート プロトコルを設定する手間をかけずに、クライアントがいつダウンしたかを知ることができました。
または、ハートビート プロトコルを設定し、次のようなコードを使用する必要があります。
sock.disconnectFromHost();
sock.waitForDisconnected();
の代わりにsock.waitForDisconnected(-1)
。