长连接与短连接
什么是長連接,什么是短連接?
什么是長連接,什么是短連接?
什么是長連接,什么是短連接?
什么是長連接,什么是短連接?
TCP/IP通信程序設計的豐富多樣性,剛接TCP/IP通信設計的人根據(jù)范例可以很快編出一個通信程序,據(jù)此一些人可能會認為TCP/IP編程很簡單。其實不然,TCP/IP編程具有較為豐富的內(nèi)容。其編程的豐富性主要體現(xiàn)在通信方式和報文格式的多樣性上。
一、?通信方式 主要有以下三大類:
(一)SERVER/CLIENT方式
??1.一個Client方連接一個Server方,或稱點對點(peer to peer):
??2.多個Client方連接一個Server方,這也是通常的并發(fā)服務器方式。
??3.一個Client方連接多個Server方,這種方式很少見,主要 用于一個客戶向多個服務器發(fā)送請求情況。
(二)連接方式
1.長連接 ?Client方與Server方先建立通訊連接,連接建立后不斷開,然后再進行報文發(fā)送和接收。這種方式下由于通訊連接一直存在,可以用下面命令查看連接是否建立: netstat –f inet|grep 端口號(如5678)。 此種方式常用于點對點通訊。
?2.短連接 Client方與Server每進行一次報文收發(fā)交易時才進行通訊連接,交易完畢后立即斷開連接。此種方式常用于一點對多點通訊,比如多個Client連接一個Server.
(三)發(fā)送接收方式
1.異步 報文發(fā)送和接收是分開的,相互獨立的,互不影響。這種方式又分兩種情況:
?(1)異步雙工:接收和發(fā)送在同一個程序中,有兩個不同的子進程分別負責發(fā)送和接收
?(2)異步單工:接收和發(fā)送是用兩個不同的程序來完成。
???2.同步 報文發(fā)送和接收是同步進行,既報文發(fā)送后等待接收返回報文。同步方式一般需要考????????慮超時問題,即報文發(fā)上去后不能無限等待,需要設定超時時間,超過該時間發(fā)送方不再等待讀?返回報文,直接通知超時返回。
????實際通信方式是這三類通信方式的組合。比如一般書上提供的TCP/IP范例程序大都是同步?短連接的SERVER/CLIENT程序。
有的組合是基本不用的,比較常用的有價值的組合是以下幾種:
同步短連接Server/Client
同步長連接Server/Client
異步短連接Server/Client
異步長連接雙工Server/Client
異步長連接單工Server/Client
其中異步長連接雙工是最為復雜的一種通信方式,有時候經(jīng)常會出現(xiàn)在不同銀行或不同城市之間的兩套系統(tǒng)之間的通信。比如金卡工程。由于這幾種通信方式比較固定,所以可以預 先編制這幾種通信方式的模板程序。
二.報文格式 通信報文格式多樣性更多,相應地就必須設計對應的讀寫報文的接收和發(fā)送報文函數(shù)。
?(一)阻塞與非阻塞方式
1.非阻塞方式
???讀函數(shù)不停地進行讀動作,如果沒有報文接收到,等待一段時間后超時返回,這種情況一般需要指定超時時間。 2.阻塞方式 如果沒有報文接收到,則讀函數(shù)一直處于等待狀態(tài),直到有報文到達。
(二)循環(huán)讀寫方式
??1.一次直接讀寫報文在一次接收或發(fā)送報文動作中一次性不加分別地全部讀取或全部 發(fā)送報文字節(jié)。
??2.不指定長度循環(huán)讀寫這一般發(fā)生在短連接進程中,受網(wǎng)絡路由等限制,一次較長的報 文可能在網(wǎng)絡傳輸過程中被分解成了好幾個包。一次讀取可能不能全部讀完一次報文,這就需要循環(huán)讀報文,直到讀完為止。
??3.帶長度報文頭循環(huán)讀寫 這種情況一般是在長連接進程中,由于在長連接中沒有條件能夠判斷循環(huán)讀寫什么時候結束,所以必須要加長度報文頭。讀函數(shù)先是讀取報文頭的長度,再根據(jù)這個長度去讀報文.實際情況中,報頭的碼制格式還經(jīng)常不一樣,如果是非ASCII碼的報文頭,還必須轉(zhuǎn)換成ASCII,常見的報文頭碼制有: (1)n個字節(jié)的ASCII碼 (2)n個字節(jié)的BCD碼 (3)n個字節(jié)的網(wǎng)絡整型碼 以上是幾種比較典型的讀寫報文方式,可以與通信方式模板一起預先提供一些典型的API讀寫函數(shù)。當然在實際問題中,可能還必須編寫與對方報文格式配套的讀寫API. 在實際情況中,往往需要把我們自己的系統(tǒng)與別人的系統(tǒng)進行連接,有了以上模板與API,可以說連接任何方式的通信程序都不存在問題。
什么時候用長連接,短連接?
長連接多用于操作頻繁,點對點的通訊,而且連接數(shù)不能太多情況,。每個TCP連接都需要三步握手,這需要時間,如果每個操作都是先連接,再操作的話那么處理速度會降低很多,所以每個操作完后都不斷開,次處理時直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。例如:數(shù)據(jù)庫的連接用長連接, 如果用短連接頻繁的通信會造成socket錯誤,而且頻繁的socket 創(chuàng)建也是對資源的浪費。
而像WEB網(wǎng)站的http服務一般都用短鏈接,因為長連接對于服務端來說會耗費一定的資源,而像WEB網(wǎng)站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,而且同時有成千上萬的用戶,如果每個用戶都占用一個連接的話,那可想而知吧。所以并發(fā)量大,但每個用戶無需頻繁操作情況下需用短連好。
總之,長連接和短連接的選擇要視情況而定。
?發(fā)送接收方式
1、異步?
報文發(fā)送和接收是分開的,相互獨立的,互不影響。這種方式又分兩種情況:?
(1)異步雙工:接收和發(fā)送在同一個程序中,由兩個不同的子進程分別負責發(fā)送和接收?
(2)異步單工:接收和發(fā)送是用兩個不同的程序來完成。?
2、同步?
報文發(fā)送和接收是同步進行,既報文發(fā)送后等待接收返回報文。 同步方式一般需要考慮超時問題,即報文發(fā)出去后不能無限等待,需要設定超時時間,超過該時間發(fā)送方不再等待讀返回報文,直接通知超時返回。
在長連接中一般是沒有條件能夠判斷讀寫什么時候結束,所以必須要加長度報文頭。讀函數(shù)先是讀取報文頭的長度,再根據(jù)這個長度去讀相應長度的報文。
項目實例已存儲硬盤。
什么是長連接,什么是短連接?
?
貼個經(jīng)典的
,
看完了就應該沒啥問題了
?
:?
TCP/IP
通信程序設計的豐富多樣性
,
剛接
TCP/IP
通信設計的人根據(jù)范例可以很快編出一個通信程
序,據(jù)此一些人可能會認為
TCP/IP
編程很簡單。其實不然,
TCP/IP
編程具有較為豐富的內(nèi)容。其
編程的豐富性主要體現(xiàn)在通信方式和報文格式的多樣性上。
?
一、通信方式
?
主要有以下三大類
:??
(
一
)SERVER/CLIENT
方式
??
1.
一個
Client
方連接一個
Server
方,或稱點對點
(peer?to?peer)
:
??
2.
多個
Client
方連接一個
Server
方,這也是通常的并發(fā)服務器方式。
??
3.
一個
Client
方連接多個
Server
方,這種方式很少見,主要
?
用于一個客戶向多個服務器
發(fā)送請求情況。
??
(
二
)
連接方式
??
1.
長連接
?Client
方與
Server
方先建立通訊連接,連接建立后不斷開,然后再進行報文發(fā)
送和接收。
這種方式下由于通訊連接一直存在,
可以用下面命令查看連接是否建立:
?netstat?
–
f?inet|grep?
端口號
(
如
5678)
。
?
此種方式常用于點對點通訊。
?
?2.
短連接
?Client
方與
Server
每進行一次報文收發(fā)交易時才進行通訊連接,
交易完畢后立
即斷開連接。此種方式常用于一點對多點通訊,比如多個
Client
連接一個
Server.??
(
三
)
發(fā)送接收方式
?
1.
異步
?
報文發(fā)送和接收是分開的,相互獨立的,互不影響。這種方式又分兩種情況:
?
?(1)
異步雙工:接收和發(fā)送在同一個程序中,有兩個不同的子進程分別負責發(fā)送和接收
??
(2)
異步單工:接收和發(fā)送是用兩個不同的程序來完成。
?
?2.
同步
?
報文發(fā)送和接收是同步進行,
既報文發(fā)送后等待接收返回報文。
同步方式一般需要考慮
超時問題,
即報文發(fā)上去后不能無限等待,
需要設定超時時間,
超過該時間發(fā)送方不再等待讀返
回報文,直接通知超時返回。
?
實際通信方式是這三類通信方式的組合。比如一般書上提供的
TCP/IP
范例程序大都是同步短連
接的
SERVER/CLIENT
程序。
?
有的組合是基本不用的,比較常用的有價值的組合是以下幾種:
?
同步短連接
Server/Client?
同步長連接
Server/Client??
異步短連接
Server/Client??
異步長連接雙工
Server/Client??
異步長連接單工
Server/Client??
其中異步長連接雙工是最為復雜的一種通信方式,
有時候經(jīng)常會出現(xiàn)在不同銀行或不同城市
之間的兩套系統(tǒng)之間的通信。比如金卡工程。由于這幾種通信方式比較固定,所以可以預
?
先編
制這幾種通信方式的模板程序。
?
二
.
報文格式
?
通信報文格式多樣性更多,
相應地就必須設計對應的讀寫報文的接收和發(fā)送報文函
數(shù)。
??
(
一
)
阻塞與非阻塞方式
?
??
1.
非阻塞方式
??
讀函數(shù)不停地進行讀動作,
如果沒有報文接收到,
等待一段時間后超時返回,
這種情況一般需要
指定超時時間。
?2.
阻塞方式
?
如果沒有報文接收到,
則讀函數(shù)一直處于等待狀態(tài),
直到有報文到
達。
??
(
二
)
循環(huán)讀寫方式
??
1.
一次直接讀寫報文在一次接收或發(fā)送報文動作中一次性不加分別地全部讀取或全部
?
發(fā)送報文
字節(jié)。
??
2.
不指定長度循環(huán)讀寫這一般發(fā)生在短連接進程中,受網(wǎng)絡路由等限制,一次較長的報
?
文可能
在網(wǎng)絡傳輸過程中被分解成了好幾個包。
一次讀取可能不能全部讀完一次報文,
這就需要循環(huán)讀
報文,直到讀完為止。
?
?3.
帶長度報文頭循環(huán)讀寫
?
這種情況一般是在長連接進程中,
由于在長連接中沒有條件能夠判斷
循環(huán)讀寫什么時候結束,
所以必須要加長度報文頭。
讀函數(shù)先是讀取報文頭的長度,
再根據(jù)這個
長度去讀報文
.
實際情況中,報頭的碼制格式還經(jīng)常不一樣,如果是非
ASCII
碼的報文頭,還必
須轉(zhuǎn)換成
ASCII,
常見的報文頭碼制有:
?(1)n
個字節(jié)的
ASCII
碼
?(2)n
個字節(jié)的
BCD
碼
?(3)n
個
字節(jié)的網(wǎng)絡整型碼
?
以上是幾種比較典型的讀寫報文方式,可以與通信方式模板一起預先提供一
些典型的
API
讀寫函數(shù)。
當然在實際問題中,
可能還必須編寫與對方報文格式配套的讀寫
API.?
在
實際情況中,往往需要把我們自己的系統(tǒng)與別人的系統(tǒng)進行連接,有了以上模板與
API,
可以說
連接任何方式的通信程序都不存在問題。
轉(zhuǎn)載于:https://www.cnblogs.com/arctictern/p/6632701.html
總結
- 上一篇: javase学习第10天(形式参数和返回
- 下一篇: WPF 自定义快捷键命令(COMMAND