![](/img/trans.png)
[英]How to connect TIdTCPClient to TIdTCPServer on Android/IOS?
[英]How long does TidTCPClient keep connection status with TidTCPServer without packet communication
我正在使用 Delphi 中的 Indy TCP 組件制作服務器-客戶端通信系統。
客戶端和服務端組件一旦連接好,如果長時間沒有包通信,這個連接還能保持多久?
如果我的想法是錯誤的,那么是否需要任何信號包通信來防止斷開連接?
在 TCP 級別,一旦建立連接就不需要發送數據包。 如果您沒有要發送的消息,則無需發送任何內容。 理論上,連接可以無限期地保持打開狀態。
但是,在實踐中,可能存在影響空閑連接(防火牆/路由器規則等)的網絡級別的要求。 為了解決這個問題,客戶端和/或服務器應該定期告訴對方連接在空閑期間故意保持打開狀態(無論如何這只是良好的通信設計)。
您可以將顯式消息添加到您的通信協議中,這只是您根據需要在計時器上來回發送消息的額外編碼問題。 如果您發送消息,但在合理的時間內沒有得到回復,您可以關閉兩端的連接。
如果您的協議不支持在應用程序級別添加此類消息,您也可以在 TCP 級別啟用 TCP 自己的內置 keep-alive 數據包。 在這種情況下,任何一方(或者最好是雙方)都可以在建立連接后調用TIdTCPConnection.Socket.Binding.SetKeepAliveValues()
方法:
procedure SetKeepAliveValues(const AEnabled: Boolean; const ATimeMS, AInterval: Integer);
其中AEnabled
打開/關閉 keep-alives, ATimeMS
是發送第一個 keep-alive 數據包之前的空閑超時(毫秒), AInterval
是發送每個后續 keep-alive 數據包之間的間隔(毫秒)。
就像任何其他 TCP 數據包一樣,keep-alives 在 TCP 級別得到確認。 因此,如果連接失效並且沒有響應保持活動,操作系統將在一段時間后超時並為您關閉 TCP 連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.