繁体   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