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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章