簡體   English   中英

Okhttp websocket服務器關機檢測

[英]Okhttp websocket server Shutdown detection

I am developing a nodemcu websocket server android client app using java.i successfully created client and connected to it through a websocket client service.i can detect server failure/closed when sending data.but can't detect it at the time of failure that是如果服務器關閉無法知道直到發送一些數據。如何在失敗時知道服務器故障。使用 okhttp 4.1.0 庫。任何人都可以幫忙

故障時如何知道服務器故障。使用 okhttp 4.1.0 庫。任何人都可以幫忙

你不能。 這是不可能的,但是,有一些解決方法,見下文。

為什么不可能? 在內部,互聯網是分組交換的,這意味着數據首先被收集成數據包,然后這些數據包被發送。

您在 web 上所做的大部分事情都感覺像是“流”(您發送 1 個字符,一個字符到達另一側)。 但這一切都基於建立在互聯網數據包性質之上的協議。

當您通過互聯網在兩台計算機之間建立開放連接時,實際上根本沒有發送任何數據 這不像您預留了一條線路。 舊的電話網絡確實是這樣工作的:當你撥打某人時,你有一條專線,一旦線路中斷,你會聽到嗶嗶聲表示這一點。

這不是互聯網的運作方式 那些電線和介於兩者之間的所有東西根本不知道有一個開放的連接。 這只是您計算機和服務器上 memory 中的一些位,它們可以讓他們將某些數據包識別為這兩台機器進行的較長對話的一部分,僅此而已。

因此我們得出了為什么這是不可能的:鑒於在一方實際向另一方發送數據之前沒有任何數據包在流動,因此無法區分“現在沒有數據發送”和“有人絆倒了”服務器園區中的電源線”。 這就是為什么在您發送某些東西之前您不會獲得該信息的原因(您獲得該信息的原因僅僅是因為當您發送某些東西時,協議規定服務器會向您發回收到您發送的內容的確認。如果這需要太長時間,您的計算機會再發送幾次,以防數據包在某個地方丟失,最終會放棄並得出服務器無法再訪問或崩潰或斷電的結論,然后您才會收到 IOException) .

解決方法

一個簡單的方法是升級您自己的協議:規定服務器或客戶端(無論誰負責執行此操作)至少每分鍾發送一次無操作消息。 然后,您可以在 100 秒左右未收到該連接后得出結論,因此連接可能已失效。 您可以啟動一個 100 秒的計時器,每次收到任何數據時都可以重置它。 如果計時器用完? 連接可能已死。

這在某種程度上是對內置在協議中的這個想法的采納,它讓您建立感覺就像數據流的連接。 該協議稱為 TCP/IP,該功能稱為KeepAlive

問題是,您可能無法為 websocket 連接指定 TCP/IP 設置。 如果可以,您可以打開 keepalive(例如在 java 中,您使用 Socket 進行原始 TCP/IP 連接,它有一個.setSoKeepAlive(true)方法。檢查 API 是否可以訪問套接字或以其他方式掃描'keepalive'的文檔,看看那里是否有任何東西。

我打賭不會有,這意味着你必須使用我上面提到的技巧:更新你的服務器代碼以使用計時器在任何對話后 60 秒發送“你好”; 並更新您的客戶端代碼以在 100 秒過去后放棄連接(再給它 40 秒。有時互聯網會有點備份或服務器有點忙)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM