gpt4 book ai didi

java - UDP包分离

转载 作者:搜寻专家 更新时间:2023-11-01 09:03:36 25 4
gpt4 key购买 nike

我正在 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数据包的解决方案。

在我目前的解决方案中,我必须定义我必须读取的数据包长度,但我在收到它之前不知道数据包长度。

我漏掉了什么吗?


编辑:感谢 Tobias 和 shazin 都是正确的答案。遗憾的是我不能将两个答案标记为正确。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com