我正在 andorid 上创建 UDP 服务。 为了清楚起见,复制了部分代码:
byte[] message = new byte[1500];
DatagramPacket packet = new DatagramPacket(message, message.length);
socket = new DatagramSocket(Constants.LISTENING_PORT_NUMBER);
socket.receive(packet);
问题是我连续接收 UDP 数据包。 例如数据包#1(250 字节长)、数据包#2(182 字节长)、数据包#3(403 字节长)等...
我需要获取并处理长度可变的单独的 UDP 数据包。 根据 UDP 协议(protocol)规范,UDP 数据包已定义消息边界。 但是我在Java中没有找到可以分离UDP数据包的解决方案。
在我当前的解决方案中,我必须定义必须读取的数据包长度,但在接收数据包之前我不知道数据包长度。
我是不是漏掉了一点?
编辑: 感谢托比亚斯和沙辛,两者都是正确的答案。遗憾的是我无法将两个答案标记为正确。
socket.receive(packet);
会接收到UDP数据包边界,后续的数据包可以用另一个socket.receive(packet);
读取。
我的问题应该是,在第一条消息的处理过程中,由于同步处理,到达的进一步消息不会被处理,现在我将消息处理传递给异步任务,并希望能够及时捕获所有到达的数据包。
最佳答案
您无法事先知道数据包长度。您可以根据您可能接收的数据定义最大边界字节数组。建议使用 2048 字节数组。
byte[] message = new byte[2048];
即使传入消息数据包的长度可变,您也可以使用以下代码来接收
byte[] message = new byte[2048];
DatagramPacket packet = new DatagramPacket(message, message.length);
socket = new DatagramSocket(Constants.LISTENING_PORT_NUMBER);
socket.receive(packet);
String data = new String(packet.getData(), 0, packet.getLength());
getData 和 getLength 方法可用于确定接收到的数据包的大小。
关于java - UDP数据包分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13494323/