Zba*_*ian 5 java size udp packet
在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);
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
我已经读过一些我可以发送超过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);
Run Code Online (Sandbox Code Playgroud)
并且控制台说:
GET:测试............................................... ............................
(点代表白色空间)
这意味着如果我想将UDP数据包发送到服务器,我必须找到字符串的长度(例如)并乘以2?
没有.String.getBytes()已经分配了正确长度的正确数组:
byte[] buff = string.getBytes();
Run Code Online (Sandbox Code Playgroud)
然后,buff.length包含适当的长度.请注意,长度取决于用于将String转换为字节数组的字符集.
另外,您应该避免使用无参数,String.getBytes()因为它使用平台的默认字符集将其String转换为字节数组.更好地明确传递编码:
byte[] buff = null;
try {
buff = string.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我已经读过一些我可以发送超过65k数据的地方,因为IPv4协议会自动将数据包分成多块,而不是接收器将它们合并.这是真的?
TCP确实如此.我建议您使用TCP,而不是UDP.
| 归档时间: |
|
| 查看次数: |
8830 次 |
| 最近记录: |