我目前正在开发一个通过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方面管理断开连接?
谢谢大家。
答案 0 :(得分:4)
除非远程对等方明确发送断开请求(通过使用 close()或 shutdown()方法),否则TCP不会通知您断开连接或者您尝试写入已断开连接的套接字(在这种情况下,您会收到损坏的管道信号)
解决此问题的经典方法是实施心跳消息系统,在经过一定量的心跳不活动后,关闭套接字,断定远程对等方突然死亡或存在网络问题。