Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UDP数据包分离_Java_Android_Udp - Fatal编程技术网

Java 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

我正在android上创建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(数据包)
将接收到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()
,对吗?