Re: [問題] Socket keep-alive 連線

看板java作者 (LaPass)時間10年前 (2015/07/08 13:47), 編輯推噓0(005)
留言5則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《noapaov (單身漢)》之銘言: : 請問一下, 假設Client 與 Server保持Socket連線, Client這邊直接把網路線拔掉, : 此時Server應該是無法收到Client斷線的訊息, 因為沒有完成4-way Handshake程序, : 因此Server要如何判斷Client已經斷線呢? : 我在網路上查詢發現蠻多人使用 sendUrgentData(0xFF); (大陸稱心跳包) : 透過定時發送封包的方式, 來確認Client是否已經斷線, : 不知道大家也是用這個方式嗎? 還是有其他方式呢? : 謝謝 Socket s = new Socket(); s.setSoTimeout(30000); s.setKeepAlive(true); s.connect(address); 其實原理也是跟心跳包一樣,只是一個是底層做掉,另外一個是自己寫。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.87.115 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1436334454.A.124.html

07/08 13:54, , 1F
用 send 的會比較準,有些包在 NAT 內的環境會把你抓著連線
07/08 13:54, 1F

07/08 16:25, , 2F
是沒錯,我也習慣自己寫心跳包
07/08 16:25, 2F

07/08 17:27, , 3F
送一個不被 Client/Server 認定為有用的封包
07/08 17:27, 3F

07/08 17:27, , 4F
加上判定 socket timeout 即可
07/08 17:27, 4F

07/08 17:28, , 5F
但送的時間要比 socket timeout 早
07/08 17:28, 5F
文章代碼(AID): #1LdBbs4a (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1LdBbs4a (java)