我正在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);
读取。
我的问题应该是在第一条消息的过程中由于同步处理而没有处理到达的其他消息,现在我将消息处理传递给异步任务,并希望能够及时捕获所有到达的数据包。 / p>
答案 0 :(得分: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方法可用于确定接收数据包的大小。
答案 1 :(得分:1)
也许我在这里遗漏了一些东西,但是DatagramPacket
是一个发送的数据包。它具有获取数据所需的getLength()
和getOffset()
方法。我相信还有一个getData()
可以返回发送的数据。
这里有一个link,可以帮助您。