客戶端的實現:
1, 如果你正在對流進行讀寫,那么表示其實你己經在活躍狀態,不需要發送心跳消息
2, 如果你的網絡是空閑的, 那么需要指定一個時間間隔(如20sec)向server發送心跳消息。
所謂的心跳不過就是當網絡空閑時,循環用指定的消息格式向服務器發送消息,服務器收到后也用指定的消息格式返回消息,雙方確認都在線。
如果你問的是后台的實現:
1, 一個主機不可以一次只能響應一個client,你需要並發響應,否則client的使用就是惡夢。你可以自己寫多線程來處理如何並發,書上都有實例可以抄。 但這樣的效率相當低,並且你很難處理多線程間同步和死鎖問題,所以Java4以后引入了NIO的機制來解決復雜的服務器並發編程,並且速度非常快, 但是NIO本身卻也很復雜, 所以我建議采用第三方開源框架,如APACHE的MINA,不需要重復建造輪子。
2, 但如果你的業務的確需要鎖定資源,在同一時間的確只能許一個人響應,比如只想一份資料在同一時間只讓一個人編輯等。 你可以先鎖定資源,先來者先得,后來者也響應,但只響應一個提示消息,並不得到真正的資源。
3, 所以,先來者因為己經正在讀取資源,所以可以確定在線,不需要發送心跳,而后來者每次請求都有消息可以返回,要么是錯誤提示要么是心跳發送到服務器后的返回,所以只要有消息返回就可以確定雙方都網絡在線
-----------------------------------------------------------------------------------------------------------
client如何采用socket機制與后台通訊時,網絡是長連接的,不像HTTP,
HTTP每次發送消息時,會:
1. create URL connection
2. 獲取inputstream 和outputstream
3. 如果是POST,通過 stream 寫入數據到后台
4. 等待后台返回數據,並處理,最后回調自己的業務邏輯
5. 必須關閉網絡
但Socket方式是明顯不同的, 因為一旦create 連接並且后,就不需要每次都關閉連接。你只管發送消息,並且定時取消息。
問題是,我只管從連接通道中取消息的話,怎么知道連接是好的。
所以我們需要過一段時間就去試探一下連接是否好的,如果不是好的就重連一下。這就是發送心跳的目的。
當然發送心跳包是要等網絡空閉時才能發, 因為發送消息到后台也是需要消費網絡帶寬的,是需要時間的,如果發太多,或者正准備發送你的業務數據到后台之前就先發送了一堆心跳包到后台,則你的業務包要等待一段長時間,不是好的體驗。
那么怎以樣才算網絡空閉呢?
這里要用到消息隊列一個數組, 你每次需要向后台發送數據的時候都把數據封裝成一個發送任務,放在你的消息隊列里,你有一個線程,設每秒運行一次,每次運行時掃描隊列是否有任務,如果有則發送到后台,沒有則表示網絡空閑,你的心跳計時器還發啟動,計時到20秒時,插一個心跳任務到你的隊列
-------------------------------------------------------------------
socket.io..和pomelo的socket都實現了心跳..
1.服務端向客戶端發送心跳..,客戶端記錄接受心跳的時間..
2.客戶端每隔一段時間檢查,服務端的心跳時間是否大於超時時間久可以了....
就是說.客戶端不用去向服務端發送心跳.
