2013-08-16 99 views
0

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

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(); 
    } 
    } 
} 

回答

1

,因为你叫receive只有一次,然后退出,您会收到只有一个UDP数据包。如果发送多个数据包,您将收到一个数据包,其他数据包将被丢弃并永久丢失。

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

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(); 
} 
+0

如果您不知道数据包的大小,则会发生什么情况。在此代码中,字节大小为12.我测试了代码,将缓冲区大小更改为大于12,然后获得缓冲区流例外 – user1739999

+0

使用数据报,你必须知道最大的数据包有多大。一旦你收到它,你可以用'getLength'方法检查数据包的大小。 – Joni

0

我把它加入一个while循环和移动 DatagramSocket的S =新的DatagramSocket(2010年)工作; byte [] data = new byte [12];外部循环