【问题标题】:Life time of QTcpSocketQTcpSocket 的生命周期
【发布时间】:2011-07-28 18:45:54
【问题描述】:

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

在服务器端,我使用QTcpServer 和信号QTcpServer::newConnection() 来获取与QTcpServer::nextPendingConnection() 新连接的QTcpSocket。我已经实现了一个名为SocketManager 的类,它管理这个套接字接收到的数据。

在 Android 端,我使用 java Socket 连接到服务器。

一切都很好。当 Android 端与服务器断开连接时,我的 SocketManager 对象会得到很好的通知并自行销毁。但是我想正确管理例如Android设备离线或关闭的情况。在这种情况下,我不会收到 Android 断开连接的通知。我连接了我的QTcpSocket 的这些信号:

  • QAbstractSocket::disconnected(),
  • QAbstractSocket::stateChanged(QAbstractSocket::SocketState)
  • QAbstractSocket::error(QAbstractSocket::SocketError)
  • QObject::destroyed(QObject*),认为QTcpSocket 可能在内部被QTcpServer 销毁。

但安卓设备离线或关机时收不到信号。

QTcpSocket什么时候会被QTcpServer释放?只有当套接字明确断开连接时?所以就我而言,它永远不会被摧毁吗?我应该在 Android 端管理所有情况下的断开连接吗?

谢谢大家。

【问题讨论】:

    标签: android qt sockets


    【解决方案1】:

    TCP 不会通知您断开连接,除非远程对等方显式发送断开连接请求(通过使用 close()shutdown() 方法) 或者您尝试写入断开连接的套接字(在这种情况下,您会收到 broken pipe 信号)

    解决这个问题的经典方法是实现一个心跳消息系统,在一定数量的心跳不活动之后,您关闭套接字,从而得出远程对等方突然死亡或存在网络问题的结论。

    【讨论】:

    • 这就是我所担心的。这是你建议我实施的一种投票系统吗?我的意思是:一个测试套接字或管道状态的常规计时器?我希望有一个基于事件或信号的解决方案,但你证实了我的想法。谢谢。
    猜你喜欢
    • 2014-09-10
    • 2013-04-06
    • 1970-01-01
    • 2013-04-20
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2012-02-10
    相关资源
    最近更新 更多