Java UDP数据包大小

标签 java udp size 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);

UDP数据包限制呢? 65k一包。例如,如果我想向服务器发送数据文件,我必须发送 65/2k 数据!我将 65 除以 2,增益限制是多少? 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 协议(protocol)会自动将数据包分成多个部分,然后接收方会将它们合并。这是真的吗?

为什么我的缓冲区中有空白?我已经编写了一个客户端和一个服务器应用程序,并且我正在使用一个 250 大小的缓冲区。如果我发送一个字,例如“Test”,它有 8 个字节长,我会在“Test”字后得到一个很长的空白:

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

控制台显示:

GET: Test...........................................................................

(点代表空白)

最佳答案

That means if I want to send an UDP packet to a server, I must find the length of the string (for example) and multiply by 2?

没有。 String.getBytes() 已经分配了一个正确长度的数组:

byte[] buff = string.getBytes();

然后,buff.length 包含适当的长度。请注意,长度取决于用于将字符串转换为字节数组的字符集。

附带说明一下,您应该避免使用无参数的 String.getBytes(),因为它使用您平台的默认字符集将 String 转换为字节大批。最好显式传递编码:

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

I have read somewhere that I can send over than 65k data, because IPv4 protocol automatically divides the packet into pieces than the receiver will merge them. Is this true?

TCP 是这样。我建议您在您的情况下使用 TCP,而不是 UDP。

关于Java UDP数据包大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14683267/

相关文章:

sockets - UDP 未连接套接字发送失败,直到它收到第一个数据报

php - 在 Wordpress 中获取未注册的图像大小

ios - View 不会像在 Storyboard 中那样出现在 iPhone 上

java - 生成安全动态 key 的最佳方法

java - 如何将 JDBC 查询的结果保存到变量中?

java - 麦克风 UDP 实时音频流

TCP/IP 数据包和数据报

size - 如何更改 latex 报告中的主要文本字体大小

java - 是否可以在右侧而不是顶部创建文档注释?

java - 问题 hibernate (java.sql.SQLSyntaxErrorException : ORA-01722: invalid number)