簡體   English   中英

Java UDP數據包大小

[英]Java UDP packet size

在Java中,單個字符是16位,2個字節。 這意味着如果我想將UDP數據包發送到服務器,我必須找到字符串的長度(例如)並乘以2?

String string = "My awesome string!";
byte[] buff = new byte[ string.length*2 ];
buff = string.getBytes();
...
packet = new DatagramPacket(buff, buff.length, address, port);
socket.send(packet);

UDP數據包限制怎么樣? 65k一包。 例如,如果我想將數據文件發送到服務器,我必須發送65 / 2k數據! 我將65分為2,什么是buff限制? 65/2或65 kb?

例如:

byte[] buff = new byte[ 65000 ]

//file and bufferreader handle
while( ( line = bufferedReader.readLine() ) != null ){
   buff = line.getBytes();
   packet = new DatagramPacket(buff, buff.length, address, port);
   socket.send(packet);
}

我已經讀過一些我可以發送超過65k數據的地方,因為IPv4協議會自動將數據包分成多塊,而不是接收器將它們合並。 這是真的?

為什么我的緩沖區有空格? 我寫了一個客戶端和一個服務器應用程序,我正在使用250大小的緩沖區。 如果我發送一個單詞,例如“Test”,這是8個字節長,我在“Test”字后得到一個很長的空格:

byte[] buff = new byte[250];
packet = new DatagramPacket(buff, buff.length);
socket.receive(packet);
System.out.println("GET: " + buff);

並且控制台說:

GET:測試............................................... ............................

(點代表白色空間)

這意味着如果我想將UDP數據包發送到服務器,我必須找到字符串的長度(例如)並乘以2?

String.getBytes()已經分配了一個正確長度的正確數組:

byte[] buff = string.getBytes();

然后, buff.length包含適當的長度。 請注意,長度取決於用於將String轉換為字節數組的字符集。

另外,您應該避免使用無參數的String.getBytes()因為它使用平台的默認字符集將String轉換為字節數組。 更好地明確傳遞編碼:

byte[] buff = null;
try {
   buff = string.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
   e.printStackTrace();
}

我已經讀過一些我可以發送超過65k數據的地方,因為IPv4協議會自動將數據包分成多塊,而不是接收器將它們合並。 這是真的?

TCP確實如此。 我建議您使用TCP,而不是UDP。

我已經讀過一些我可以發送超過65k數據的地方

不是通過UDP你不能。 IPv4中的絕對最大值為65507字節,實際限制為534字節。

因為IPv4協議會自動將數據包分成多個部分而不是接收器將它們合並。 這是真的?

這是真的,但成功的重組只能由TCP保證,並且它不會提高UDP的上限

使用TCP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM