QTcpSocket的生命周期

时间:2011-07-28 10:12:10

标签: android qt sockets

我目前正在开发一个通过TCP连接到服务器的Android应用程序。服务器是用Qt编写的,可以在计算机上运行。

在服务器端,我使用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*),认为QTcpSocket可能在内部销毁了QTcpSocket。

但Android设备离线或关闭时未收到任何信号。

QTcpSocket何时由QTcpServer发布?只有当套接字明确断开时?所以在我的情况下,它永远不会被销毁吗?我是否应该在Android方面管理断开连接?

谢谢大家。

1 个答案:

答案 0 :(得分:4)

除非远程对等方明确发送断开请求(通过使用 close() shutdown()方法),否则TCP不会通知您断开连接或者您尝试写入已断开连接的套接字(在这种情况下,您会收到损坏的管道信号)

解决此问题的经典方法是实施心跳消息系统,在经过一定量的心跳不活动后,关闭套接字,断定远程对等方突然死亡或存在网络问题。