我正在开发一个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"));
这消除了错误,但我的多播并不起作用。数据包已发送但未收到。
答案 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);
致谢