未从localhost接收到Java多播套接字

未从localhost接收到Java多播套接字,java,android,sockets,wifi,multicast,Java,Android,Sockets,Wifi,Multicast,一、 我正在开发一个移动应用程序(Android),它与PC端的服务器应用程序一起工作。我需要使用多播UDP数据报在连接到WIFI区域的智能手机上发送信息。 我有两个模块: 第一个模块是UDP多播服务器 private void connection() { System.setProperty("java.net.preferIPv4Stack", "true"); String msg = "Hello"; InetAddress group = null;

一、 我正在开发一个移动应用程序(Android),它与PC端的服务器应用程序一起工作。我需要使用多播UDP数据报在连接到WIFI区域的智能手机上发送信息。 我有两个模块: 第一个模块是UDP多播服务器

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();
        }
    }
}
此函数(up)用于创建多播套接字并在多播地址224.0.2.0:6789处发送信息

第二个模块是第一个程序发送的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防火墙和防病毒软件,但不起作用。我不知道为什么数据包在网络上没有正确重定向。也许我的代码中有错误?谢谢。

在Android设备上,您需要获得多播锁。您还需要以下权限:

<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中的多播支持似乎并不像一些用户希望的那样可靠。看


即它是否实际工作或可能取决于设备。它在我的Nexus5上不工作

不同的机器是如何连接的?您的路由器是否配置为不发送多播?您是否已经找到解决方案?我正在为一个类似的项目而挣扎,这个项目的功能几乎是一样的,但却无法正常工作。注意:使用nmap,我发现在运行程序时指定的端口保持关闭状态。我的情况与此相同。我们如何实现多播UDP数据包的另一种方法。也许,如果我们能在低水平上编码。但我找不到另一个解决办法。我看到了一个库,cling,它能够实现PnP设备的通信。在我可以测试的大多数设备中,它都能在多播不起作用的地方工作。有什么建议吗?我不能评论克林。但我发现我可以让它工作,但我需要保持在特定的多播地址。