组播:在组播套接字(java / android)上使用joinGroup未收到

时间:2017-04-13 07:40:39

标签: java android sockets multicastsocket

我正在开发一个Android应用程序(使用java):我试图使用java MulticastSocket在多个手机之间发送信息。 这些手机在启动应用程序时连接到同一个访问点,此访问点是我的计算机。这很有效,因为当应用程序启动时,我可以访问互联网。 但是,当我尝试在我的套接字上执行joinGroup时,我收到错误: java.net.SocketException:setsockopt failed:ENODEV(没有这样的设备)

我已经对此进行了大量研究,但没有结果与我的问题相符。

这是我的代码:

在主要活动中,我将手机连接到同一个热点。

msg = handlerConnectionMsg.obtainMessage();
        Bundle b = new Bundle();

        // Get the wifi manager
        WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

        WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock("mydebuginfo");
        multicastLock.setReferenceCounted(true);
        multicastLock.acquire();

        // Enable the wifi
        boolean wasEnabled = wifiManager.isWifiEnabled();

        msg = handlerConnectionMsg.obtainMessage();
        b = new Bundle();
        b.putInt("connection_message", ACTIVATING_WIFI);
        msg.setData(b);
        handlerConnectionMsg.sendMessage(msg);

        wifiManager.setWifiEnabled(true);
        // Wait for the connection
        while(!wifiManager.isWifiEnabled());

        boolean ret = true;

        // Connect to the access point and disable the connection to others
        if (wifiManager.isWifiEnabled() && wifiManager.startScan())
        {
            msg = handlerConnectionMsg.obtainMessage();
            b = new Bundle();
            b.putInt("connection_message", CONNECTION_AP);
            msg.setData(b);
            handlerConnectionMsg.sendMessage(msg);

            ret = connectToAP(wifiManager, "trainee_hotspot_test", "d0nt3nt3rThis");
        }

        if (!ret)
        {
            msg = handlerConnectionMsg.obtainMessage();
            b = new Bundle();
            b.putInt("connection_message", CONNECTION_ERROR);
            msg.setData(b);
            handlerConnectionMsg.sendMessage(msg);

            return;
        }

        msg = handlerConnectionMsg.obtainMessage();
        b = new Bundle();
        // Valid connection
        b.putInt("connection_message", CONNECTED);
        b.putString("current_ap", wifiManager.getConnectionInfo().getSSID());
        msg.setData(b);
        handlerConnectionMsg.sendMessage(msg);
    }

    private boolean connectToAP(WifiManager wifi, String name, String pass)
    {
        // Create a new wifiConfiguration object
        WifiConfiguration wifiConfig = new WifiConfiguration();

        // Add informations to it
        wifiConfig.SSID = String.format("\"%s\"", name);
        wifiConfig.preSharedKey = String.format("\"%s\"", pass);

        // We add this configuration to the wifi manager and get the id
        int netId = wifi.addNetwork(wifiConfig);
        // Disconnect from the current AP
        wifi.disconnect();
        // Enable the hotspot with given SSID if it exists
        boolean status = wifi.enableNetwork(netId, true);
        wifi.reconnect();

        return status;
    }
}

该类中的这两行创建了多播套接字并处理数据接收。

multicastSocket = new MulticastSocket(port);
multicastSocket.joinGroup(getGroup());

端口为4321,组播地址(由getGroup返回)为224.1.1.1

我不明白为什么这不起作用,当我在计算机上使用多播套接字时效果很好。

谢谢大家,祝你有个美好的一天

**更新:**

我通过替换:

删除错误
multicastSocket.joinGroup(getGroup());

通过:

        multicastSocket.joinGroup(new InetSocketAddress(getGroup(), port), NetworkInterface.getByName("p2p0"));

这消除了错误,但我的多播并不起作用。数据包已发送但未收到。

1 个答案:

答案 0 :(得分:0)

我知道这个问题太老了,但是最近这些天我无法将组播数据包从一个接口(eth0)发送到另一个接口(usbnet0)(我的Odroid UX4中有2个以太网,usb hub + ethernet)而且我正在像您一样使用代码,但无法正常工作,总是将数据包发送到默认接口“ eth0”

错误代码;

NetworkInterface nif2 = NetworkInterface.getByName("usbnet0");

MulticastSocket mcs2 = new MulticastSocket(dPort);

mcs2.joinGroup(new InetSocketAddress(dIP, dPort), nif2);

但是我只需要使用另一种方法来设置正确的接口

正确的代码;

NetworkInterface nif2 = NetworkInterface.getByName("usbnet0");

MulticastSocket mcs2 = new MulticastSocket(dPort);

mcs2.setNetworkInterface(nif2);  //THIS LINE IS THE KEY

mcs2.joinGroup(new InetSocketAddress(dIP, dPort), nif2);

致谢