2012-04-18 31 views
0

我試圖發回一個數據包給用戶,通知他們當前在服務器上的所有人,當他們發送一條消息到服務器上有「who」這個詞的時候。UDP在這裏丟失了我的數據包的一部分嗎?

這裏是我的代碼:

else if(response.contains("who")) 
{ 
    System.out.println("Size of names collection: "+names.size()); 

    buf = null; 
    buf = names.toString().getBytes(); 

    int thisPort = packet.getPort(); 
    packet = new DatagramPacket(buf, buf.length,packet.getAddress(),thisPort); 
    socket.send(packet); 
} 

上面打印語句的輸出是2,表明有兩個人,例如安德魯和詹姆斯。現在,當我打包併發送它,我會期待它輸出這樣的:

[安德魯,詹姆斯]

但不是客戶端獲取:

[安德魯,

並且那它。有什麼問題? BTW我不得不使用UDP,這和不能切換到TCP

UPDATE

下面是客戶端類中接收的數據包的代碼:

while(true) 
     { 
      try 
      { 
       // Set the buf to 256 to receive data back from same address and port 
       buf = null; 
       buf = new byte[256]; 
       packet = new DatagramPacket(buf, buf.length, address, 4445); 
       socket.receive(packet); 

       String response = new String(packet.getData()); 

       // Receive the packet back 
       System.out.println(response); 
      } 
      catch(IOException e) 
      { 

      } 

     } 
+3

我想你剛剛發佈了一半你的問題 – Chirlo 2012-04-18 18:04:35

+0

所以任何想法的人? – Katana24 2012-04-18 18:53:52

+0

你是說這種事情總是發生,或者只是偶爾和隨意地發生? – 2012-04-18 18:57:45

回答

3

您的數據報被截斷爲256個字節,因爲這是您爲接收DatagramPacket聲明的緩衝區的大小。如果您的數據報可以更長,請將緩衝區設置得更大。

最好的做法是使它比您期望收到的最大的數據報大一點。然後如果您收到一個大小的應用程序協議錯誤。

+0

感謝隊友現在的作品。我認爲,爲了解決協議錯誤,我會創建一個方法來記錄接收到的最新數據包的大小,然後將接收緩衝區設置爲比所記錄的大513個字節 - 您的想法是什麼?還有爲什麼數據包被截斷? – Katana24 2012-04-18 22:21:21

+0

@ Katana24因爲這就是它在Javadoc中所說的:「如果消息比數據包的長度長,則消息被截斷」。數據報通過UDP完整保存,但是隨後Java或更可能是Sockets API不得不截斷它以將其壓縮到您的256字節中。很難看到它還能做些什麼。 – EJP 2012-04-18 23:16:29

+0

可以理解 - 但是像數組列表這樣的集合必須比它們的字符串對象大很多 - 因爲我手動創建了一個具有相同名稱和字符串的字符串,並將它們發送並且沒有問題。 – Katana24 2012-04-19 09:52:15

0

你的問題不完整。但是..

UDP丟失數據包。這就是爲什麼使用UDP進行文件傳輸的目的不可靠。 Adobe RTMFP使用UDP傳輸音頻和視頻數據,其中很多數據包都會丟失。但與TCP相比,音頻/視頻內容流的速度更快。我不知道這是否回答你的問題,我只是想說,UDP確實會丟失數據包。

+0

重新檢查我的帖子 - 是的,我知道這個 – Katana24 2012-04-18 18:12:05

+2

然而,它不會丟失部分數據包,如果一個數據包到達,它是完好無損的 – 2012-04-18 19:03:14

1

您應該分別在發送/接收操作(使用getLength方法)之後檢查客戶端和服務器上DatagramPacket的長度,以確保它是相同的,這將是第一個提示。你在用什麼來收集的名字

+0

我使用數組列表,你知道答案嗎?如果是這樣,請告訴我:P花了一整天 – Katana24 2012-04-18 21:36:53

+0

好的 - 我檢查了它,在服務器代碼中,發送的數據包的長度是,對於兩個客戶端1026.當接收到數據包時,數據包長度是256。這裏發生了什麼? – Katana24 2012-04-18 21:42:23

+0

好的答案隊友:P – Katana24 2012-04-18 22:15:47

相關問題