客户端通过QTcpSocket连上QTcpServer后,客户端断开服务器连接(disconnectFromHost()方法),服务器这边删除对应的QTcpSocket对象后崩溃
客户端关键代码
void Widget::closeEvent(QCloseEvent *e)
{
if(tcpSocket->state() != tcpSocket->ClosingState)
{
tcpSocket->disconnectFromHost();
}
}
服务器中的QRunnable
void SocketThread::do_socket_disconnected()
{
QString info = QString("%1 [%2:%3]离线了").arg(NOW).arg(ipStr).arg(port);
qCInfo(category)<<info;
delete this->socket;
}
void SocketThread::do_socket_disconnected()
{
QString info = QString("%1 [%2:%3]离线了").arg(NOW).arg(ipStr).arg(port);
qCInfo(category)<<info;
delete this->socket;
}
服务器主线程关键代码
void TcpService::do_new_connection()
{
QTcpSocket* socket = tcpServer->nextPendingConnection();
QString info = QString("%1 [%2:%3]上线了").arg(NOW).
arg(socket->peerAddress().toString()).arg(socket->peerPort());
qCInfo(category) << info;
pool->setExpiryTimeout(1000);
thread = new SocketThread(socket);
// connect(thread,&SocketThread::finished,this,&TcpService::do_work_finished);
bool res = pool->tryStart(thread);
qCInfo(category)<<NOW<<"addr:"<<thread;
QString threadStartInfo = QString("%1 [%2:%3]%4").arg(NOW).
arg(socket->peerAddress().toString()).
arg(socket->peerPort()).
arg(res?"线程启动成功":"线程启动失败");
qCInfo(category)<<threadStartInfo;
}
客户端代码:https://github.com/gali-like-like/TcpClient.git
服务器代码:https://github.com/gali-like-like/TcpServer.git