在接收连接时,关联disconneted信号,这个信号没有参数,我们可以使用sender()获取信号发送者,也就是客户端socket,这样我们就知道哪个客户端和我们断开连接了。
但是这个方法有个缺点,就是如果客户端异常退出,没有调用disconnect函数,则服务端接收不到这个disconnected的信号。
// 接收连接
void TcpServer::onAccept()
{
QTcpSocket* pQTcpSocket = qtcpServer->nextPendingConnection();
if (pQTcpSocket==nullptr)
return;
connect(pQTcpSocket,&QTcpSocket::disconnected,this,&TcpServer::clientDisconnected);
client = pQTcpSocket;
qDebug()<<"receive connect!"<<pQTcpSocket;
}
// 客户端断开连接
void TcpServer::clientDisconnected()
{
QTcpSocket* pQTcpSocket = static_cast<QTcpSocket*>(sender());
qDebug()<<"receive disconnect!"<<pQTcpSocket;
pQTcpSocket->deleteLater();
}
还有一种方法,就是启动一个定时器,定时遍历客户端列表,每个客户端尝试发送一个数据,如果发送失败会返回-1,这是就可以将这个返回-1的socket删除掉。