瘋狂Java TCP 半關閉Socket

2021-07-10 17:39:32 字數 1309 閱讀 1036

1. 怎樣表示輸入或輸出的結束:

1) 都知道tcp通訊其實就是用客戶端(socket物件)的socket傳遞資料的,傳遞資料都是通過socket類獲取inputstream和outputstream的;

2) 一般最糾結的就是不知道對方的輸出什麼時候結束,前面給出的示例都沒有處理輸出結束(對方)的問題,除非你直接關閉程式否則輸出永遠都不會結束;

3) 都知道只要關閉輸出流就表示輸出結束,但是在socket通訊中,一旦輸出流被徹底關閉就意味著socket的關閉,那麼網路通訊就無法繼續了,通常希望關閉輸出流之後輸入流還可以繼續從遠端接受資料,或者關閉輸入流之後還能通過輸出流向遠端傳送資料;

4) 因此socket類提供了半關閉的方法:

i. void shutdownoutput(); // 只關閉輸出流(但輸入流仍然能用)進入半寫狀態(write-half),通知對方遠端輸出已經關閉,

ii. void shutdowninput(); // 只關閉輸入流(但輸出流仍然能用)進入半讀狀態(read-half),通知對方遠端讀取已經關閉

!!即使先後呼叫這兩個方法也不會關閉socket,只不過處於既不能輸出也不能輸入的廢物狀態;

!!!上面的方法是半關閉方法,那麼徹底關閉輸出輸入流應該怎麼做呢?

a. 通常會對socket物件呼叫getinputstream、getoutputstream然後用bufferedreader、printstream等包裝;

b. 那個包裝器就是徹徹底底的輸入輸出流了,如果呼叫包裝器物件br、ps的close方法那就徹底的關閉輸入輸出流了;

c. 它們的關閉就意味著socket也被關閉了!!

!!檢查socket物件是否關閉的方法:boolean socket.isclosed();

5) 同樣socket類也提供了檢視是否處於半讀半寫狀態的方法:

i. boolean isoutputshutdown(); // 是否處於半寫狀態

ii. boolean isinputshutdown(); // 是否處於半讀狀態

2. 半關閉適用於哪些場景:

1) 當然是用於那些不需要長久保持通訊狀態的一站式服務;

2) 特別適用於http通訊,而且特別適用於客戶端,因為客戶端在傳送請求後就無需再傳送其它資料了,往往只是等待伺服器端返回想要的資源;

3) 因此在客戶端傳送完請求之後就可以立馬半關閉輸出流了(半寫狀態);

3. 示例:

public class server 

scan.close();

s.close();

ss.close();

}}

優雅地斷開套接字連線 套接字半關閉

呼叫close函式斷開連線,意味著完全斷開連線,不僅無法傳輸資料,而且也不能接收資料。兩台主機通過套接字建立連線後進入可交換資料的狀態。把建立套接字後可交換資料的狀態看作一種流。為了實現雙向通訊,套接字生成的兩個流。shutdown函式關閉其中乙個流。呼叫上述函式時,第二個引數決定斷開連線的方式 s...

讀書筆記 TCP IP網路程式設計 第7章 半關閉

半關閉 斷開連線的一部分,可以傳輸資料但是無法接收,或可以接收資料但無法傳輸。closesocket 函式會同時斷開輸入及輸出流。sd receive 斷開輸入流 sd send 斷開輸出流 sd both 同時斷開i o流 shutdown 函式,關閉輸出流時,既傳送了eof,還保留了輸入流。re...

第八節 基於半關閉的檔案傳輸

迴圈寫操作 write clie fd,buf,buf size 傳送檔案後針對輸出流進行半關閉,這樣就向客戶端傳輸了eof,而客戶端也知道檔案傳輸已完成 shutdown clie fd,shut wr 只關閉了輸出流,依然可以通過輸入流接收資料 傳送eof read clie fd,buf,bu...