天天看點

長連接配接 短連接配接 異步 同步 )阻塞與非阻塞詳解

一。通信方式 

主要有以下三大類: 

(一)SERVER/CLIENT方式 

1.一個Client方連接配接一個Server方,或稱點對點(peer to peer): 

2.多個Client方連接配接一個Server方,這也是通常的并發伺服器方式。 

3.一個Client方連接配接多個Server方,這種方式很少見,主要 

用于一個客戶向多個伺服器發送請求情況。 

(二)連接配接方式 

1.長連接配接 

Client方與Server方先建立通訊連接配接,連接配接建立後不斷開, 

然後再進行封包發送和接收。這種方式下由于通訊連接配接一直 

存在,可以用下面指令檢視連接配接是否建立: 

netstat –f inet|grep 端口号(如5678)。 

此種方式常用于點對點通訊。 

2.短連接配接 

Client方與Server每進行一次封包收發交易時才進行通訊連 

接,交易完畢後立即斷開連接配接。此種方式常用于一點對多點 

通訊,比如多個Client連接配接一個Server. 

(三)發送接收方式 

1.異步 

封包發送和接收是分開的,互相獨立的,互不影響。這種方 

式又分兩種情況: 

(1)異步雙工:接收和發送在同一個程式中,有兩個不同的 

子程序分别負責發送和接收 

(2)異步單工:接收和發送是用兩個不同的程式來完成。 

2.同步 

封包發送和接收是同步進行,既封包發送後等待接收傳回封包。 

同步方式一般需要考慮逾時問題,即封包發上去後不能無限等 

待,需要設定逾時時間,超過該時間發送方不再等待讀傳回報 

文,直接通知逾時傳回。 

實際通信方式是這三類通信方式的組合。比如一般書上提供的 

TCP/IP範例程式大都是同步短連接配接的SERVER/CLIENT程式。有的 

組合是基本不用的,比較常用的有價值的組合是以下幾種: 

同步短連接配接Server/Client 

同步長連接配接Server/Client 

異步短連接配接Server/Client 

異步長連接配接雙工Server/Client 

異步長連接配接單工Server/Client 

其中異步長連接配接雙工是最為複雜的一種通信方式,有時候經 

常會出現在不同銀行或不同城市之間的兩套系統之間的通信。 

比如金卡工程。由于這幾種通信方式比較固定,是以可以預 

先編制這幾種通信方式的模闆程式。 

二.封包格式 

通信封包格式多樣性更多,相應地就必須設計對應的讀寫封包的接 

收和發送封包函數。 

(一)阻塞與非阻塞方式  

1.非阻塞方式 

讀函數不停地進行讀動作,如果沒有封包接收到,等待一段時間後 

逾時傳回,這種情況一般需要指定逾時時間。 

2.阻塞方式 

如果沒有封包接收到,則讀函數一直處于等待狀态,直到有封包到達。 

(二)循環讀寫方式 

1.一次直接讀寫封包 

在一次接收或發送封包動作中一次性不加分别地全部讀取或全部 

發送封包位元組。 

2.不指定長度循環讀寫 

這一般發生在短連接配接程序中,受網絡路由等限制,一次較長的報 

文可能在網絡傳輸過程中被分解成了好幾個包。一次讀取可能不 

能全部讀完一次封包,這就需要循環讀封包,直到讀完為止。 

3.帶長度封包頭循環讀寫 

這種情況一般是在長連接配接程序中,由于在長連接配接中沒有條件能夠 

判斷循環讀寫什麼時候結束,是以必須要加長度封包頭。讀函數 

先是讀取封包頭的長度,再根據這個長度去讀封包.實際情況中, 

報頭的碼制格式還經常不一樣,如果是非ASCII碼的封包頭,還必須 

轉換成ASCII,常見的封包頭碼制有: 

(1)n個位元組的ASCII碼 

(2)n個位元組的BCD碼 

(3)n個位元組的網絡整型碼 

以上是幾種比較典型的讀寫封包方式,可以與通信方式模闆一起 

預先提供一些典型的API讀寫函數。當然在實際問題中,可能還 

必須編寫與對方封包格式配套的讀寫API. 

什麼是長連接配接?

其實長連接配接是相對于通常的短連接配接而說的,也就是長時間保持用戶端與服務端的連接配接狀态。

通常的短連接配接操作步驟是:

連接配接-》資料傳輸-》關閉連接配接;

而長連接配接通常就是:

連接配接-》資料傳輸-》保持連接配接-》資料傳輸-》保持連接配接-》…………-》關閉連接配接;

這就要求長連接配接在沒有資料通信時,定時發送資料包,以維持連接配接狀态,短連接配接在沒有資料傳輸時直接關閉就行了

什麼時候用長連接配接,短連接配接?

長連接配接主要用于在少數用戶端與服務端的頻繁通信,因為這時候如果用短連接配接頻繁通信常會發生Socket出錯,并且頻繁建立Socket連接配接也是對資源的浪費。

但是對于服務端來說,長連接配接也會耗費一定的資源,需要專門的線程(unix下可以用程序管理)來負責維護連接配接狀态。

總之,長連接配接和短連接配接的選擇要視情況而定。

一般在java上代碼實作是

短連接配接: 

run(){ 

read //讀取請求包 

process //處理 

write //應答處理結果 

長連接配接: 

while(NotEnd){ 

read 

process 

write 

}

以下是關于長連接配接中的檢測保持連接配接的心跳比喻

連接配接短連接配接隻是一個概念性的問題,隻要知道其概念,不是一個特殊的東西:

長連接配接:系統通訊連接配接建立後就一直保持。

短連接配接:隻有系統需要互相發消息連接配接才建立(用戶端發起),請求消息得到響應後連接配接關閉;

通訊實體間使用長連接配接,一般還需要定義心跳消息,定期發送來檢測系統間鍊路是否異常,每隔一定時間發送一次心跳,如果一定次數沒有收到心跳消息,這認為此連接配接出現問題,需要斷開連接配接重建立立。

具體心跳消息的格式,以及發送間隔,以及多少次沒有收到心跳就認為鍊路異常,以及資料部是否算作心跳消息(有的系統如果接收到資料包則會清除心跳計時器也就相當于系統中的資料包也算作心跳消息);這個需要兩端進行協商。比如GSM常用的短消息中心和其他網絡實體互連的SMPP協定,要求建立的就是長連接配接.

是以長短連接配接隻是一個概念問題長短連接配接的socket,就是使用普通的socket函數,沒有什麼特殊的。

最後,關于同步與異步

同步操作指上一個操作傳回結果後才能發下一個操作的資料包

異步操作指先把所有的操作資料包發完後再等待它們的傳回結果

相比較看異步操作速度快特别是在每個包處理方法獨立的情況下

異步操作一般提供兩個端口,一個負責接收資料,一個負責發送資料

<<<<<<<<<<<<<<==========================================>>>>>>>>>>>>>>>>

長短的差別是我要搞清楚,見現在看而言,長連接配接占用資源,但是一般通信性能肯定是好,短省資源。另外一個很重要的差別就是,主動與被動,長連接配接是先主動建立一個連接配接,有資料就發送,沒有就等,短連接配接則是如果有通信要求,被動的先建立一個連接配接,收發資料,斷開。具體的好壞個人覺得還是需要程式設計實踐才知道。應該說對與server和client的影響還是很大。

繼續閱讀