2

我正在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 协议规范,UDP 数据包定义了消息边界。但是我在 Java 中没有找到可以分离 UDP 数据包的解决方案。

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

我错过了一点吗?


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

socket.receive(packet);接收到 UDP 数据包边界,随后的数据包可以与另一个socket.receive(packet);.
我的问题应该是在第一条消息的过程中,由于同步处理,到达的进一步消息没有被处理,现在我将消息处理传递给异步任务,希望能够及时捕获所有到达的数据包。

4

2 回答 2

2

您无法事先知道数据包长度。您可以根据可能收到的数据定义最大边界字节数组。建议使用 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 方法可用于确定接收数据包的大小。

于 2012-11-21T13:39:46.253 回答
1

也许我在这里遗漏了一些东西,但 aDatagramPacket是发送的一个数据包。它具有获取数据所需的getLength()和方法。getOffset()我相信还有一个getData()返回发送的数据。

在这里,您有一个可以进一步帮助您的链接。

于 2012-11-21T13:30:02.960 回答