2017-07-04 61 views
1

我一直在玩websocket(使用Sails.js,內置套接字,基於Socket.io)。websocket如何知道服務器被關閉?

我注意到Chrome每25秒收到兩幀。我認爲這是一種投票來告訴連接仍在繼續。

但是之後,我取消了服務器並立即通知Chrome。

另外,我用kill命令強制關閉了Node進程,Chrome仍被通知,這意味着在關閉服務器之前它並不是Node發送信號。

這是怎麼發生的?

+0

當對等進程退出時,該連接或者用FIN關閉,或者用對等操作系統用RST重置,這又導致流的結束或本地套接字上的「連接重置」。 – EJP

回答

3

正常的TCP套接字連接做到這一點,所以如果websocket 不是,那將是令人驚訝的。

當服務器進程死亡/退出/被終止時,服務器內核負責清理。這包括釋放內存,關閉文件和關閉套接字。乾淨地關閉TCP套接字需要發送消息告訴對等體。

有趣的是,在一些帶有用戶空間winsock的舊版Windows中,如果服務器進程崩潰,則不會發生這種情況。在符合TCP支持的所有操作系統上,除非內核本身掛起,機器斷電或網絡中斷,否則應該保證。

+0

乾淨地關閉TCP套接字需要向對等方發送* FIN *消息。 RST是*失敗*關閉。 – EJP

+0

不錯,所以如果互聯網連接突然完全與服務器斷開(沒有任何時間告訴客戶端),客戶端將無法立即告訴連接斷開? –

+0

@EJP是的,我故意避免提及'FIN'和'RST',因爲它比OP想要的更加細緻,並且一旦知道發生了什麼,查找細節就很簡單。 – Useless

相關問題