近期使用go 開發聊天室,使用到websocket常鏈接。
if err = websocket.JSON.Receive(ws,&reply); err != nil { log.Println(err) return }
我發現當連接斷開的時候會走if里面,輸出eof
這樣就知道,客戶端斷開了連接。
但在之前使用workerman 中發現其中有一塊是《心跳機制》,這個心跳機制也是判斷鏈接是否斷開。
所以我就覺得判斷鏈接是否斷開了,這個功能是不是重復了。或者心跳機制是不是多余的。(個人理解)
先說下我查閱資料得到的對心跳機制的理解
心跳機制是客戶端,自己發送心跳包給服務端來檢測鏈接是否正常。大致方法是在客戶端寫一個定時器,定時向服務端發送一個短小精悍的包。然后服務端接收到包再返回給客戶端一條信息。每次一套:客戶端發送包->服務端接收返回相應->客戶端接受相應;正常執行,表示該鏈接正常。否則則認為斷線。
心跳包會像心跳一樣每隔固定時間發送一次。
理解來源:http://www.codeweblog.com/socket%E5%BF%83%E8%B7%B3%E5%8C%85%E6%9C%BA%E5%88%B6/
對於服務端中獲取斷線輸出eof和心跳機制個人理解
可能是如果只是通過服務端來判斷鏈接是否正常,是不穩定的,或者只通過服務端判斷鏈接是否正常的話無法控制客戶端斷線后的提示、操作。所以在客戶端也需要一個心跳機制,雙重判斷鏈接是否正常。這樣當鏈接斷開后,服務端可以有操作(刪除服務端在線列表中該用戶等),客戶端也可以有操作(重新發送登錄請求,或提示用戶等),這樣既可以保證程序的正常使用,也可以提高用戶體驗。
個人觀點!