[英]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.