2013-08-16 98 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];外部循環