2014-02-21 50 views
0

我有一個是在一個循環中收到UDP報文的Java應用程序的UDP數據包:該怎麼辦抵達件

while (running) { 
    try { 
     // Block until a packet is received on the port 
     byte[] buffer = new byte[1024]; 
     DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length); 
     serverSocket.receive(receivePacket); 
     ByteArrayInputStream byteIn = new ByteArrayInputStream(receivePacket.getData(), 0, receivePacket.getLength()); 
     DataInputStream dataIn = new DataInputStream(byteIn); 

     // Print packet 
     String packetString = ""; 
     while((packetString = dataIn.readLine()) != null) { 
      Log.d("WiFi", packetString); 
     } 

    } catch (IOException ex) { 
     Log.d("WiFi", "Problem receiving: " + ex.toString()); 
    } 
} 

當我到達的數據包,其中不乏如約到達預期,但每一次的同時,我得到一個數據包被分成兩個部分:

103, -5.84, 5.64, 140.72, #A-=-22.53,-50.18,248.83, #G-=52.00,-69.00,-18.00, #M-=-146.66,-155.18,151.06, 2575012 
103, -6.51, 5.62, 140.41, #A-=-22.53,-51.20,248.83, #G-=23.00,44.00,-7.00, #M-=-146.21,-156.13,151.06, 2575036 
103, -7.23, 5.65, 140.09, #A-=-19.46,-49.15,243.71, #G-=17.00,68.00,-2.00, #M-=-144.85,-155.18,151.06, 2575063 
103, -7.76, 5.60, 139.81, #A-=-17.41,-50.18,240.64, #G-=17.00,71.00,0.00, #M-=-143.94,-155.65,153 
.47, 2575090 
103, -8.51, 5.34, 139.40, #A-=-12.29,-47.10,233.47, #G-=31.00,-1.00,-5.00, #M-=-144.85,-154.70,151.87, 2575135 
103, -9.20, 4.76, 138.95, #A-=-15.36,-50.18,239.62, #G-=22.00,30.00,-3.00, #M-=-146.66,-156.13,151.87, 2575200 
103, -9.82, 4.46, 138.61, #A-=-15.36,-47.10,239.62, #G-=33.00,1.00,-3.00, #M-=-145.76,-156.13,152.27, 2575266 
103, -10.38, 4.07, 138.23, #A-=-14.34,-48.13,235.52, #G-=30.00,4.00,-7.00, #M-=-144.85,-155.65,152.27, 2575372 
103, -10.90, 3.76, 137.90, #A-=-14.34,-48.13,237.57, #G-=29.00,19.00,-4.00, #M-=-145.30,-156.13,151.47, 2575520 
103, -11.41, 3.53, 137.44, #A-=-15.36,-48.13,235.52, #G-=25.00,18.00,-4.00, #M-=-146.21,-155.18,151.47, 2576917 

正如你可以在線路4和5中看到,4最後尾隨字符都被切斷,其餘字符的新的數據包有到達。從我關於UDP的閱讀中,大家都警告說UDP不能保證數據包的到來。在我看來,這不是問題;丟失的數據包聽到或不會破壞我的應用程序。但是,我沒有發現任何關於數據包不一定完整的情況。其實我已經讀過並不是發生。

這是怎麼處理的?我很難知道已經到達的數據包是否完整,我可以等待下一個數據包並追加數據。

+0

由於在你看到數據包之前IP級別的碎片應該在IP棧中被取消,所以我懷疑服務器正在用兩個數據包發送數據。你最好的選擇是在Wireshark觀察交通狀況的同時複製這個狀況,看看實際上正在發生什麼。這裏有足夠多不同的移動部件(服務器,網絡,操作系統,TCP/IP堆棧等),如果沒有看到網絡上的網絡流量,您不太可能進一步獲得更多信息。 –

+0

我下載了WireShark,我正在查看這些數據包。我之前沒有用過WireShark,現在我處於擺弄模式。看起來發生的情況是標準數據包大約有156個字節,但有時它將這些數據包組合成一個更大的數據包(我假設操作系統正在實現某種緩衝區?這種情況發生在頻繁的通信量時)高達492字節。 [本答案](http://stackoverflow.com/questions/9203403/java-datagrampacket-udp-maximum-buffer-size)意味着我達到了極限。通常對此做什麼? – tomsrobots

+0

不,這是指傳輸層碎片。在應用層,整個數據包到達目的地,或者不到。 UDP決不會將多個源數據報組合成單個IP數據包。您將不得不匹配Wireshark跟蹤來調試輸出並重新創建條件以查看正在發送的內容。注意IP碎片標誌; Wireshark告訴你什麼時候檢測到碎片。 –

回答

0

你所描述的是不可能的。 UDP數據報到達完整或完全沒有。服務器必須以兩個數據報發送數據。

+0

在做了一些挖掘之後,事實證明,我用來發送UDP數據包的芯片(WiFly Rn-Xv)自動將數據捆綁到較大的數據包中,然後在較大的數據包變大時將數據拆分爲多個數據包。我假設這是爲了減少開銷。我通過在我的字符串開始處添加一個特殊字符並在字符串末尾添加一個特殊字符來解決我的問題,這樣我就可以檢查一個數據包是否包含全部數據。如果沒有,我可以附加一個新的數據包。 – tomsrobots

+0

@tomsrobots:這是殺死UDP的全部點 – xmen