1. 程式人生 > >java socket 連線資料傳輸判斷是否結束

java socket 連線資料傳輸判斷是否結束


Java當中的Socket類,其實是使用TCP協議進行傳輸的.TCP是可靠的一種傳輸協議. 

如果想用TCP協議,並且,服務端和客戶端,在沒有資訊進行傳輸的時候,也不斷開連線,一般情況下,客戶端會在Socket超時之前,想服務端傳送一個用於維持連線的資訊包,來維持連線.但是TCP協議,並不是指長連線.我們每天上網瀏覽網頁,其實,也是以TCP協議為基本的傳輸協議的.只是,這個是短連線的形式,每次瀏覽器向伺服器提交一個請求,服務短應答請求,然後斷開連線. 

在應用TCP協議,並且是長連線傳輸資訊的情況下.通常會再封裝一層協議的.但,觀察版主的收發內容,並沒有涉及這一層,所以,我這裡並不知道是長連線. 

首先,我們要明確一點,傳送方如果不將輸出流進行關閉,接收方就會認為輸入流沒有結束,直到超時. 
其次,我們判斷一個資訊是否已經完全的讀取完畢,除了使用輸入流結束這種辦法,還可以自行封裝一層協議,用於資訊的互動. 
當然,我們也可以採用Http那樣的互動方式進行資訊的傳遞,但是,它是短連線的. 

下面我來說一下,TCP長連線傳輸資料的一般做法. 
一般情況下,我們會在TCP的基礎上再封裝一層協議,使用者長連線的傳輸.協議的資訊包,也分包頭和包體兩個部分. 
包體,主要就是我們要傳輸的資訊.(維持連線的資訊包,包體可為空) 
包頭,一般分為三個部分.第一部分是資訊包的長度(長度一般是指整個資訊包的長度);第二部分是包體資訊的型別(在這裡指出是否是維持連線包);第三部分是資訊包的序列號,一般情況下,這個序列號要確保在傳輸過程中唯一標識該資訊包. 
如果為了安全起見,還可以在包體後新增包尾,包尾資料用於對包體資料的驗證) 

這樣,通訊雙方就可以根據包長來判斷一次接收的操作是否結束了.