2013-10-27 47 views
2

我編寫了一個能夠通過多播地址發送/接收消息的java程序。 我給多播發送器的代碼:在本地計算機上使用多播時丟失消息

public boolean multicastSender(DataTransferObject message) { 

     try { 

      InetAddress group = InetAddress.getByName(ip); 
      MulticastSocket s = new MulticastSocket(port); 
      s.joinGroup(group); 

      String msg = jsh.dtoToJsonString(message); 
      DatagramPacket data = new DatagramPacket(
        msg.getBytes(), msg.length(), group, port); 
      s.send(data); 

      s.leaveGroup(group); 
      return true; 

     } catch (IOException e) { 
      System.out.println(e.toString()); 
      e.printStackTrace(); 
      return false; 
     } 
    } 

我給多播接收器的代碼:

public DataTransferObject multicastReceiver() { 
    try { 
     InetAddress group = InetAddress.getByName(ip); 
     MulticastSocket s = new MulticastSocket(port); 
     s.joinGroup(group); 

     byte[] buffer = new byte[1000 * 1024]; 
     DatagramPacket data = new DatagramPacket(buffer, buffer.length); 
     String jsonData; 
     DataTransferObject dto; 
     while (true) { 
      s.receive(data); 
      jsonData = new String(buffer, 0, data.getLength()); 
      dto = jsh.dtoFromJson(jsonData); 

      if (dto == null) { 
       continue; 
      } else { 

       return dto; 

      } 
     } 
    } catch (IOException e) { 
     System.out.println(e.toString()); 
     e.printStackTrace(); 
     return null; 
    } 
} 

我的程序具有聽和從四個不同的多播地址接收消息(224.0.0 4個並行線程[1 - > 4])和端口[66601-> 66604]。在測試中,我同時運行兩個程序來測試它們之間的通信。然而我發現有時候,程序A會發送一個消息給一個多播地址,在一個正確的情況下,A也會收到它,B也會收到它。但是有時候,我看到A宣佈它發送了消息,但是在那之後,A或者B再次接收它。我在本地機器上運行測試(Mac OS 10.9 with core 2 duo)。應該因爲我的電腦或其他什麼問題?
非常感謝。

回答

0

UDP,我想你的多播實現的基礎,不保證傳遞。接收器或網絡過載時會丟棄數據包。您需要一個更高級別的協議來確保傳送(谷歌可靠組播)。

0

我見過這種情況發生在Windows環境中。我知道這是因爲網絡層與JVM分開。

這意味着一個JVM可能會讀取並處理/放棄此消息,但其他JVM不會讀取相同的消息,因爲網絡層已經將UDP消息傳遞給第一個消費者,不管有多少JVM訂閱同一組。這可能是也可能不是操作系統中的一個錯誤 - 這是非常主觀的。就我個人而言,我認爲操作系統應該跟蹤註冊人以複製交付,因爲這就是客戶的意圖 - 考慮到應用程序正在加入組以接收多播,在思考時有點誤導。操作系統應該考慮到這一點。

我已經通過經驗證據得出了這個結論,而其他平臺可能並非如此。

相關問題