所以我正在試驗套接字緩沖區大小并創建了 2 個測驗用例
案例1【服務器向客戶端發送資料】
首先,我們有一個服務器,它向客戶端發送 100 位元組的資料
public static void main(String[] args)throws Exception
{
try(ServerSocket server=new ServerSocket())
{
server.bind(new InetSocketAddress(InetAddress.getLocalHost(),2500));
byte[] data=new byte[100];
for(int i=0;i<data.length;i ){data[i]=(byte)i;}
while(true)
{
try(Socket client=server.accept())
{
try(OutputStream output=client.getOutputStream())
{
output.write(data);
}
}
}
}
}
接下來我們有一個客戶端,它只是讀取接收到的 100 個位元組并列印它,但我已將
進一步確認每個資料包是 25 位元組正在檢查從客戶端發送的 ACK 視窗資料包

因此,在從客戶端服務器設定接收緩沖區大小后,案例 1 完成,發送了這么大大小的資料包
案例2【客戶端向服務器發送資料】
角色互換,這次我們在系結之前設定ServerSocket 
這樣就完成了對客戶端和服務器端的接收緩沖區的理解。如果一方廣播其接收緩沖區大小,另一方在每個資料包傳輸中只發送那么多資料,這完全有意義。
現在更難理解發送緩沖區的部分了。我對發送緩沖區的理解是
保存由套接字發送的位元組,只有在收到接收者的 ACK 后才會清空。如果它已滿,它會阻止套接字發送更多資料,直到收到 ACK。
因此,如果發送方有一個 send_buffer=10 位元組,如果接收方有一個接收緩沖區=30 位元組。發送方仍應僅發送 10 個位元組,因為它只能保留必須由接收方確認的那么多資料,然后它可以發送接下來的 10 個位元組,依此類推。但是盡管我在服務器和客戶端設定發送緩沖區的所有組合如下
1)Client sends data to server
server side=ServerSocket.setReceiveBufferSize(30);
client side=client.setSendBufferSize(10);
2)Server sends data to client
server side=serverSocket.accept().setSendBufferSize(10);
client side=client.setReceiveBufferSize(30);
接收方使用 Wire Shark 接收到的資料包總是相同的。即發送方總是發送大小為 30 位元組的資料包。即發送者總是受接收者的設定支配
a) 我的理解哪里出錯了?
b) 如上所示的一個非常簡單的測驗用例,其中發送緩沖區實際上在客戶端和服務器端都產生了影響,我們將不勝感激
uj5u.com熱心網友回復:
幾天前我提交了一個事件報告,它已被確認為錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/475869.html
