2013-08-21 49 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