標籤:
Java Socket 網路編程心跳設計概念
1、一般是用來判斷對方(裝置,進程或其它網元)是否正常動行,一 般採用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經當掉。用於檢測TCP的異常斷開。一般是用來判斷對方(裝置,進程或其它 網元)是否正常動行,一般採用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經當掉。用於檢測TCP的異常斷開。基本原因是服務 器端不能有效判斷用戶端是否線上也就是說,伺服器無法區分用戶端是長時間在空閑,還是已經掉線的情況.所謂的心跳包就是用戶端定時發送簡單的資訊給服務 器端告訴它我還在而已。代碼就是每隔幾分鐘發送一個固定資訊給服務端,服務端收到後回複一個固定資訊如果服務端幾分鐘內沒有收到用戶端資訊則視用戶端斷 開。比如有些通訊軟體長時間不使用,要想知道它的狀態是線上還是離線就需要心跳包,定時發包收包。發包方:可以是客戶也可以是服務端,看哪邊實現方便合 理。一般是用戶端。伺服器也可以定時輪詢發心跳下去。一般來說,出於效率的考慮,是由用戶端主動向伺服器端發包。
2、就是在用戶端和伺服器間定時通知對方自己狀態的一個自己定義的命令字,按照一定的時間間隔發送,類似於心跳,所以叫做心跳包。
3、就是定時發送給對方一個資料包,告訴對方自己還在維護對話,同時獲得返回的資料,判斷對方是否在會話中。
4、用戶端每隔一段時間發一個包,使用TCP的,用send發,使用UDP的,用sendto發,伺服器收到後,就知道當前用戶端還處於“活著”的狀態,否則,如果隔一定時間未收到這樣的包,則伺服器認為用戶端已經斷開,進行相應的用戶端斷開邏輯處理。
一、什麼是心跳檢測
判斷對方(裝置,進程或其它網元)是否正常動行,一般採用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經當掉。用於檢測TCP的異常斷開。
基本原因是伺服器端不能有效判斷用戶端是否線上也就是說,伺服器無法區分用戶端是長時間在空閑,還是已經掉線的情況。所謂的心跳包就是用戶端定時發送簡單的資訊給伺服器端告訴它我還在而已。
代碼就是每隔幾分鐘發送一個固定資訊給服務端,服務端收到後回複一個固定資訊。如果服務端幾分鐘內沒有收到用戶端資訊則視用戶端斷開。比如有些通訊軟體長時間不使用,要想知道它的狀態是線上還是離線就需要心跳包,定時發包收包。
發包方可以是客戶也可以是服務端,看哪邊實現方便合理。一般是用戶端。伺服器也可以定時輪詢發心跳下去。
一般來說,出於效率的考慮,是由用戶端主動向伺服器端發包,而不是相反。
二、關於Send函數的傳回值
我們知道當用戶端以優雅的方式斷開TCP串連後,伺服器使用Send函數發包,得到的傳回值為0(說明TCP串連已斷開)。然而,SEND函數的成功返回只能表示發送資料已經進入了SOCKET核心的發送隊列,不一定就已經線上上或者已經被成功接收了。這可能是因為send只是往發送緩衝區拷貝資料, 剛開始緩衝區還未滿,所以不會有錯誤發生, 只有等到相當一段長的時間後, send的傳回值才會為-1。
三、定時Ping
如果伺服器不能進行心跳檢測的應答。可以採用定時Ping某伺服器來檢測TCP串連是否斷開,如新浪(必須允許Ping的伺服器)。PING是向遠程主機發送一個ICMP包,如果給定時間內沒有接收到回應就認為是逾時,如果收到回應則分析接收到的ICMP包,得到TTL、類型以及用時。
不過Ping包有32位元組,如果是無線串連,有時需要考慮流量問題。
四、使用TCP存活定時器
Java Socket 網路編程心跳設計概念