java網路程式設計:10、基於TCP的socket程式設計(三)緩衝流、flush方法、關閉流
宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!!
文章目錄
上篇講了基於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網路程式設計:6、TCP/IP模型、TCP/IP模型與OSI參考模型的對應關係
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程式設計(三)實現相互發送接收訊息