2013-03-01 36 views
1

DatagramPacket類中,所有構造函數都需要一個int參數作爲「length」。 當我試圖接收它時,爲什麼需要設置DatagramPacket的長度,因爲我不一定知道數據包有多長時間? 我應該將其設置爲哪個數字?receive DatagramPacket

編輯: 讓我改變我的問題是:

如果DatagramSocket.receive方法有簽名

public DatagramPacket receive() {}; 

,而不是

public void receive(Datagrampacket p) {}; 

豈不更有意義?因爲如上所述,接收者通常不知道分組是什麼樣的。

由於送貨服務比喻往往是適用於UDP,讓我們說:

的DatagramSocket就像一個郵箱。 DatagramPacket就像包裹信封。 DatagramPacket.data是信封內的內容。對於送貨服務,接收者提供郵箱但不包含信封。

+0

您的修改具有誤導性。這個例子代替了「爲什麼我們需要在Datagrampacket中複製datagram.buffer.length和datagram.length?」爲什麼我們需要首先提供緩衝區。這是兩個不同的問題。而且,現在還不清楚你現在要問什麼。 – Val 2013-03-02 12:06:26

回答

1

那麼,你問它寫入一個字節數組,你提供。因此,請確保您的字節數組與您希望處理的最大數據包一樣大,並傳入參數length的數組長度。

編輯:對於編輯的問題,該API將意味着接收代碼每次都必須創建一個新的緩衝區。使用現有的API,相同的字節數組可以用於多個調用,因爲調用者可以決定何時完成使用。

現在必須承認,這將是有意義的有這樣的重載:

public DatagramPacket(byte[] buffer) 
{ 
    this(buffer, buffer.length); 
} 

...但是這是一個不同的問題。

+0

實際上這是個問題。爲什麼你應該在Java程序中提供數組的長度?奧卡姆的KISS原則是什麼? – Val 2013-03-01 19:08:35

+0

@Val:它允許您爲所有讀取重複使用相同的緩衝區,這比每次創建新字節數組的接收代碼更有效。它當然也可以模仿本地界面,當然...... – 2013-03-01 19:09:32

+0

不需要。緩衝區一次又一次地重複使用。提供長度不會使其更加可重用。 – Val 2013-03-01 19:11:27