0

以下代码仅接收数据包。我已经发送了不同大小的数据,以查看接收器是否正在接收数据。我只收到第一个数据包,看不到任何其他数据包。丢失数据包的原因可能是什么。因为我每次都收到 12 个字节。我是否需要清除缓冲区或使其更大。我应该遵循什么做法。

import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class Reciever {
  public static void main(String[] args) {
    try {
      DatagramSocket s = new DatagramSocket(2010);
      byte[] data = new byte[12];
      DatagramPacket p = new DatagramPacket(data, 12);
      s.receive(p);
      System.out.println("got packet");
      ByteBuffer bb = ByteBuffer.allocate(12).order(ByteOrder.LITTLE_ENDIAN);
      bb.put(data);
      bb.rewind();
      System.out.println(bb.getFloat());
      System.out.println(bb.getFloat());
      System.out.println(bb.getFloat());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
4

2 回答 2

1

您只收到一个 UDP 数据包,因为您receive只调用一次然后退出。如果发送了多个数据包,您将收到一个,而其他数据包将被丢弃并永远丢失。

添加一个循环以接收多个数据包:

try {
    DatagramSocket s = new DatagramSocket(2010);
    byte[] data = new byte[12];
    DatagramPacket p = new DatagramPacket(data, 12);
    while (true) {
        s.receive(p);
        System.out.println("got packet");
        ByteBuffer bb = ByteBuffer.allocate(12).order(ByteOrder.LITTLE_ENDIAN);
        bb.put(data);
        bb.rewind();
        System.out.println(bb.getFloat());
        System.out.println(bb.getFloat());
        System.out.println(bb.getFloat());
    }
} catch (IOException e) {
  e.printStackTrace();
}
于 2013-08-16T14:42:13.253 回答
0

我通过添加一个 while 循环并移动 DatagramSocket s = new DatagramSocket(2010); 让它工作了。字节[]数据=新字节[12];循环外

于 2013-08-16T14:54:48.193 回答