1. 程式人生 > >java網路程式設計:10、基於TCP的socket程式設計(三)緩衝流、flush方法、關閉流

java網路程式設計:10、基於TCP的socket程式設計(三)緩衝流、flush方法、關閉流

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!!

文章目錄

一、使用緩衝流、註釋流的關閉—帶來的效果

二、使用flush方法—帶來的效果

三、關閉流—帶來的效果

四、系列文章(java網路程式設計)


上篇講了基於tcp的程式設計,伺服器端迴圈監聽接收多個客戶端_多執行緒伺服器程式,如需瞭解可參考 java網路程式設計:9、基於TCP的socket程式設計(二)迴圈監聽接收多個客戶端_多執行緒伺服器程式 這篇我們瞭解一下里面的緩衝流、flush方法、關閉流帶來的一些效果!我們以上篇伺服器端的程式碼為例,對其進行改造。

一、使用緩衝流、註釋流的關閉—帶來的效果

在我們進行網路程式編寫的時候,還有一個要注意的問題,我們可以簡單看一下,如果說在伺服器端當我們傳送資料的時候,我們不直接用OutputStream 去傳送資料,我想增加一個帶緩衝的寫入功能,那我就去建立一個BufferedOutputStream,通常我們還會將BufferedOutputStream在連結到其它的輸出流上,比如說DataOutputStream,然後附加一個寫入java基本資料型別的功能,但是當我們一旦構造這種帶緩衝輸入流、輸出流的時候,我們就要注意它就會有一個問題了?

如上圖改造以後,我們執行伺服器端、客服端程式,我們可以發現對於客戶端來說,它始終沒有接收到資料,而我們的伺服器端也沒有接收到資料!因為我們客戶端當它在讀取資料的時候, 

int len= is.read(buf); 

因為它沒有讀到資料,所以這個操作就發生阻塞,發生阻塞那麼下面的語句也就沒有執行,

System.out.println(newString(buf, 0, len));

os.write("Hello,this is zhangsan".getBytes());//輸出流向伺服器端傳送資料

所以客戶端向伺服器端傳送的這句程式碼也就沒有得到呼叫 

os.write("Hello,this is zhangsan".getBytes());

所以伺服器端也沒有收到資料!也就是客戶端和伺服器都讀取不到資料。

那麼這個問題的發生主要是因為在伺服器端,使用了帶緩衝的輸出流,當傳送資料的時候執行語句

bos.write("Hello,welcome you,client!".getBytes());

那麼這個資料是寫在緩衝當中的,並沒有通過網路傳送出去,要等到這個緩衝滿的時候,那麼這個資料才會傳送出去。

所以這是我們在網路程式設計當中,如果使用了帶緩衝的輸出流那麼一定要注意了,帶緩衝的輸出流,會給我們網路通訊造成一定的延遲。

二、使用flush方法—帶來的效果

這時,我們可以呼叫一個flush方法,然後重新啟動伺服器端和客戶端,我們發現就可以收到資料啦!

 

三、關閉流—帶來的效果

那麼有時候為了提高網路效能,比如說你再發送大塊資料的時候,那麼我們可能會利用這個緩衝的功能。但是我們有時候使用帶緩衝的輸出流輸出資料的時候,那麼又會造成一些問題。我們傳送一個數據,那麼接收方,它需要接收這個資料之後,才能進行下一步的動作,但是由於你使用了緩衝的功能,那麼這個資料在緩衝區當中,沒有實際傳送出去,結果造成接收方,沒有接收到這個資料。這時候我們在傳送資料之後可以關閉我們的輸出流,這樣我們就不需要呼叫flush方法了。

另外要注意的是,在使用緩衝輸出流的時候,會造成網路通訊一定的延遲。

 

四、系列文章(java網路程式設計)

 java網路程式設計:1、計算機網路?網路通訊的組成?什麼是ip、協議、埠號?

 java網路程式設計:2、IP地址、協議、網路狀況、網路異質性問題的解決

 java網路程式設計:3、ISO/OSI七層參考模型

 java網路程式設計:4、OSI各層所使用的協議

 java網路程式設計:5、資料封裝

 java網路程式設計:6、TCP/IP模型、TCP/IP模型與OSI參考模型的對應關係

 java網路程式設計:7、埠、套接字(socket)的引入

 java網路程式設計:8、基於TCP的socket程式設計(一)簡單的socket通訊_一個客戶端

 java網路程式設計:9、基於TCP的socket程式設計(二)伺服器端迴圈監聽接收多個客戶端_多執行緒伺服器程式

 java網路程式設計:10、基於TCP的socket程式設計(三)緩衝流、flush方法、關閉流

 java網路程式設計:11、基於UDP的socket程式設計(一)理論、基本步驟

 java網路程式設計:12、基於UDP的socket程式設計(二)程式碼通訊-簡單例項

 java網路程式設計:13、基於UDP的socket程式設計(三)實現相互發送接收訊息