2011-07-28 34 views
3

我目前正在開發一個通過TCP連接到服務器的Android應用程序。服務器用Qt編寫,並在計算機上運行。QTcpSocket的使用時間

在服務器端,我用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內部由QTcpServer既可摧毀。

但是,當Android設備脫機或關閉時沒有收到信號。

當QTcpSocket將由QTcpServer發佈?只有當套接字明確斷開連接時?所以在我的情況下,它會永遠不會被破壞?我應該在Android方面管理所有情況下的斷開連接嗎?

謝謝大家。

回答

4

TCP不會通知你斷開的,除非遠端對等體明確地發送斷開請求(通過使用接近()shutdown()方法方法)或嘗試寫入到一個斷開連接的插座(在這種情況下你會得到一個破管信號)

經典的方式來解決這個問題,正在實施一個心跳消息系統,其中一定量的心跳活動後您關閉套接字得出的結論是遠程對等突然或出現死亡是一個ne twork問題。

+0

這就是我所害怕的。 這是一種您建議我實施的投票系統嗎?我的意思是:一個定時器,用於測試套接字或管道的狀態?我希望能有一個基於事件或信號的解決方案,但你確認我的想法。 謝謝。 –