1. 程式人生 > 實用技巧 >Java實現Socket長連線和短連線

Java實現Socket長連線和短連線

1概念

Socket:socket實際上是對TCP/IP進行的封裝,我們可以使用socket套接字通過socket來傳輸。首先我們需要明白的一個概念就是通道,簡單地說通道就是兩個對端可以隨時傳輸資料的通道。我麼常說的所謂建立socket連線,也就是建立了客戶端與伺服器端的通道。

長短連線:顯而易見,長連線也就是這個socket連線一直保持連線,也就是通道一直保持通暢,兩個對端可以隨時傳送和接收資料;短連線就是我們傳送一次或有限的幾次,socket通道就被關閉了。首先,我們必須明白的是socket連線後,如果沒有任何一方關閉,這個通道是一直保持著的,換句話說,如果任何一方都不關閉連線,這個socket連線就是長連線,因此Java中的socket本身就是支援長連線的(如一個簡單的實驗:伺服器端不關閉連線,伺服器端每隔10秒傳送一次資料,伺服器端每次都能正確接受資料,這個實驗就可以證明)。

那麼既然socket本身是支援長連線的,那麼為什麼我們還要提短連線的概念呢?試想一箇中國移動的簡訊閘道器(即通過釋出socket通訊介面)每時每分都有N多個連線傳送簡訊請求,加入伺服器不加任何限制地直接和客戶端使用長連線那麼可想而知伺服器需要承受多麼大的壓力。所以一般的socket伺服器端都是會設定超時時間的,也就是timeout,如果超過timeout伺服器沒有接收到任何資料,那麼該伺服器就會關閉該連線,從而使得伺服器資源得到有效地使用。

2 如何實現長短連線

在1中我們已經介紹了長短連線的概念,伺服器如果超過timeout時間接收不到客戶端的通訊就會斷開連線,那麼假如客戶端在timeout時間前一秒(或者更短的時間)傳送一條啟用資料來使伺服器端重新計時,如此重複就能保證伺服器一直不能進入timeout時間,從而一直保持連線,這就是長連線的實現原理。下面我們通過一張圖說明:

由上圖可見,是否是長連線完全取決於客戶端是否會在timeout時間傳送心跳訊息,因此長短連線是和客戶端相關的,伺服器端沒有任何區別(只不過伺服器端需要設定timeout而已)。

程式碼實現可參照:http://download.csdn.net/detail/feichenwangyalin/7951457