java - UDP数据包分离

标签 java android udp

我正在 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/

相关文章:

java - Python 用于运行 Java JAR,ClassNotFoundException

android - 从android中的firebase发送通知时没有通知声音

Android TTS(文字转语音)无法正确发音单个字母

PHP 能够处理多个 TCP 连接吗?

c# - 如何编写 .Net UDP 可扩展服务器

java - 为什么 PriorityQueue.toString 返回错误的元素顺序?

java - Clojure REPL,互操作,无法解析符号

java - 有没有办法完全重置 Ignite 状态?

android - 如何读取 iOS 上安装的所有应用程序列表

c# - 如何使用 UDP 实现 Traceroute?