Java UDP数据包分离
我正在android上创建UDP服务。 为清楚起见,此处复制了部分代码:Java UDP数据包分离,java,android,udp,Java,Android,Udp,我正在android上创建UDP服务。 为清楚起见,此处复制了部分代码: byte[] message = new byte[1500]; DatagramPacket packet = new DatagramPacket(message, message.length); socket = new DatagramSocket(Constants.LISTENING_PORT_NUMBER); socket.receiv
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(数据包)
将接收到UDP数据包边界,随后的数据包可以通过另一个套接字读取。接收(数据包)代码>
我的问题应该是,在处理第一条消息的过程中,由于同步处理,到达的其他消息没有得到处理,现在我将把消息处理传递给一个异步任务,希望能够及时捕获所有到达的数据包。也许我在这里遗漏了一些东西,但是DatagramPacket
是一个发送的数据包。它具有获取数据所需的getLength()
和getOffset()
方法。我相信还有一个getData()
返回发送的数据
这里有一个可以进一步帮助您的方法。您无法事先知道数据包的长度。您可以根据可能接收的数据定义最大边界字节数组。建议使用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方法可用于确定接收到的数据包的大小。我相信,在接收数据包时,您设置的任何内容都会被重写。等一下,直到我拿到文件。你到底为什么要使用udp?tcp具有数据包序列和排序功能insurance@njzk2实时流数据,您更喜欢实时性而不是可靠性。@njzk2:根据客户要求,客户正在运行一个专用网络,并与所有设备使用UDP数据包进行通信。(我的第一反应和我第一次听到的一样)你能粘贴相应的客户端代码吗?您好,DatagramPacket构造函数需要提供长度参数,因此getLength()将返回缓冲区长度,即最大长度,而不是包的长度。好的,您是对的,我的问题是,由于同步处理,后续数据包丢失,应用程序无法处理。只需将数据复制到一个线程中的一个或类似线程中,然后在另一个线程中逐个处理。给恢复线程高优先级。你理所当然地认为偏移量是0。我认为你做不到。@Tobiaritzau,你是什么意思?newstring()
中的0应该是packet.getOffset()
,对吗?