Socket緩沖區


 

1、由於可讀狀態是在對方寫入數據后或socket關閉時才能出現,因此如果客戶端和服務端都停留在read時,如果沒有任何一方,向對方寫入數據,這將會產生一個死鎖。

2、此外,在本地接收操作發起之前,很可能接收緩沖區中已經有數據了,這是一種異步。不要誤以為,本地調用接收操作后,對方才會發送數據,實際數據何時到達,本地不能做出任何假設。

 

3、

Java提供了便捷的網絡編程模式,尤其在套接字中,直接提供了與網絡進行溝通的輸入和輸出流,用戶對網絡的操作就如同對文件操作一樣簡便。在客戶端與服務端建立Socket連接后,客戶端與服務端間的寫入和寫出流也同時被建立,此時即可向流中寫入數據,也可以從流中讀取數據。在對數據流進行操作時,客戶端和服務端的read和write是不對應的。

如果服務端先向客戶端輸出了兩次,之后刷新了輸出緩沖區。客戶端先向服務端輸出了一次,然后刷新輸出緩沖,之后調用了一次接收操作。服務端和客戶端的輸入和輸出並不是對應的,有時一次接收操作可以接收對方幾次發過來的信息,並且不是每次輸出操作對方都需要接收處理。

 

 

在創建Socket后,系統會為新創建的套接字分配緩沖區空間。這時套接字已經具有了輸入緩沖區和輸出緩沖區。緩沖區大小需要根據具體情況進行設置,一般要低於64K(TCP能夠指定的最大負重載數據量,TCP的窗口大小是由16bit來確定的),增大緩沖區可以增大網絡I/O的性能,而減少緩沖區有助於減少傳入數據的backlog(就是緩沖長度,因此提高響應速度)。對於Socket和SeverSocket如果需要指定緩沖區大小,必須在連接之前完成緩沖區的設定。

了解了Socket緩沖區的概念后,需要探討一下Socket的可寫狀態和可讀狀態。當輸出緩沖區未滿時,Socket是可寫的(注意,不是對方啟用接收操作后,本地才能可寫,這是錯誤的理解),因此,當套接字被建立時,即處於可寫如的狀態。對於可讀,則是指緩沖區中有接收到的數據,並且這些數據未完成處理。在socket創建時,並不處於可讀狀態,僅當連接的另一方向本套接字的通道寫入數據后,本套接字方能處於可讀狀態(注意,如果對方套接字已經關閉,那么本地套接字將處於可讀狀態,並且每次調用read后,返回的都是-1)。

對於緩沖區空間的設定,要根據具體情況來定,如果存在大量的長信息(比如文件傳輸),將緩沖區定義的大些,可能更好的利用網絡資源,如果更多的是短信息(比如聊天消息),使用小的緩沖區可能更好些,這樣刷新的速度會更快。一般系統默認的緩沖大小是8*1024。除非對自己處理的情況很清晰,否則請不要隨意更改這個設置。

 

如果想要將多條輸入的信息區分開,可以使用一些技巧,在文件操作中使用-1表示EOF,就是文件的結束,在網絡傳輸中,也可以使用-1表示一條傳輸語句的結束。在客戶端和服務端對稱的使用這兩個類,可以將每一條信息分析出來。並不是將網絡的傳輸同步,而是分析出緩沖中的數據,將以-1為結尾進行數據划分。如果寫聊天程序可以使用類似的模式。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM