2013-08-21 90 views
0

我正在開發一個與PC端服務器應用程序一起工作的移動應用程序(Android)。我需要使用組播UDP數據報在連接到WIFI區域的智能手機上發送信息。 我有兩個模塊: 第一個模塊是一個UDP多播服務器。在多播地址224.0.2.0:6789未收到本地主機的Java多路廣播套接字

private void connection() { 
    System.setProperty("java.net.preferIPv4Stack", "true"); 
    String msg = "Hello"; 
    InetAddress group = null; 
    try { 
     group = InetAddress.getByName("224.0.2.0"); 
    } catch (UnknownHostException e3) { 
     // TODO Auto-generated catch block 
     e3.printStackTrace(); 
    } 
    while (true) { 
     MulticastSocket s = null; 
     try { 
      s = new MulticastSocket(6789); 
     } catch (IOException e2) { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 
     try { 
      s.joinGroup(group); 
      s.setTimeToLive(200); 

     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     DatagramPacket hi = new DatagramPacket(msg.getBytes(), 
       msg.length(), group, 6789); 
     try { 

      s.send(hi); 
      System.out.println(hi.toString()); 
      s.leaveGroup(group); 
      s.close(); 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

該功能(向上)創建一個MulticastSocket上和發送信息。

第二個模塊是第一個程序發送的UDP數據包的java接收器。

byte[] b = new byte[1024]; 
      DatagramPacket dgram = new DatagramPacket(b, b.length); 
      MulticastSocket socket = null; 
      try { 
       socket = new MulticastSocket(6789); 
      } catch (IOException e) { 
       Log.e("WIFI_E", e.getMessage()); 
      } // must bind receive side 
      try { 
       socket.joinGroup(InetAddress.getByName("224.0.2.0")); 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      //while(true) { 
      try { 
       socket.receive(dgram); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } // blocks until a datagram is received 
      Toast.makeText(getApplicationContext(), "Received " + dgram.getLength() + 
         " bytes from " + dgram.getAddress(), Toast.LENGTH_LONG); 
      dgram.setLength(b.length); // must reset length field! 
      //} 

這是我的代碼。現在的問題。 當我啓動服務器(PC端)時,UDP數據包僅在本地主機上可見(使用Wireshark進行測試),並且smarthpone或其他PC無法接收它們。我嘗試關閉Windows防火牆和防病毒軟件,但無法正常工作。我不知道爲什麼數據包沒有在網絡上正確重定向。也許我的代碼中有一些錯誤?謝謝。

+0

不同的機器如何連接?您的路由器可能配置爲不發送多播? – xaxxon

+0

您是否已經找到解決方案?我正在爲類似的項目苦苦掙扎,這個項目幾乎完全相同,並且無法實現。注意:使用* nmap *我發現運行程序時指定的端口保持關閉狀態。 – s3lph

回答

0

在Android設備上,您需要獲取MulticastLock。您還需要以下權限:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 

說了這麼多,似乎在Android的支持組播並不像固體一些使用可能希望。見http://codeisland.org/2012/udp-multicast-on-android/

即,它實際上是否工作或可能是設備相關。它不適用於我的Nexus5

+0

我也是這樣。我們如何實現另一種組播UDP數據包的方式。也許,如果我們可以在低級別編碼。但我找不到另一種解決方案。我看到了一個圖書館,它能夠實現PnP設備的通信。它可以在大多數設備上工作,我可以測試組播不起作用的地方。有關它的任何建議? –

+0

我無法對Cling發表評論。但我發現我可以使它工作,但我需要保持在特定的多播地址。 – William