QTcpSocket的生命周期

3
我目前正在开发一个连接到计算机上运行的Qt服务器的Android应用程序,并通过TCP与其进行连接。
在服务器端,我使用一个QTcpServer和一个信号QTcpServer::newConnection()来获得QTcpSocket从QTcpServer::nextPendingConnection()连接到的新连接。我实现了一个名为SocketManager的类,它管理由此套接字接收到的数据。
在Android端,我使用Java Socket来连接服务器。
一切都很顺利。当Android端从服务器断开连接时,我的SocketManager对象会被通知并销毁自己。但是,我想正确地处理例如Android设备离线或关闭的情况。在这种情况下,我没有收到Android断开连接的通知。我连接了我QTcpSocket的以下信号:
QAbstractSocket::disconnected(), QAbstractSocket::stateChanged(QAbstractSocket::SocketState), QAbstractSocket::error(QAbstractSocket::SocketError), QObject::destroyed(QObject*), thinking that perhaps the QTcpSocket is internally destroyed by the QTcpServer.
但当Android设备离线或关闭时,没有信号被接收到。
当QTcpSocket将被QTcpServer释放?只有在套接字明确断开连接时吗?那么在我的情况下,它永远不会被销毁吗?我应该在Android端管理所有情况中的断开连接吗?
谢谢大家。
1个回答

4
TCP除非远程对等方显式发送断开请求(使用close()或shutdown()方法),否则不会通知您断开连接;如果您尝试向已断开的套接字写入数据,则会收到一个“broken pipe”信号。
解决此问题的经典方法是实现心跳消息系统,在一定量的心跳“活动无效”后,关闭套接字并得出结论:远程对等方突然死亡或存在网络问题。请注意保留HTML标记。

这就是我所担心的。你建议我实现一种轮询系统吗?我的意思是:定期计时器测试套接字或管道的状态?我希望有一种基于事件或信号的解决方案,但你证实了我的想法。谢谢。 - pamplemousse_mk2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接