我,我正在开发一个与PC端的服务器应用程序一起使用的移动应用程序(Android)。我需要使用多播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();
}
}
}
此功能(向上)创建MulticastSocket并以多播地址 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数据包仅在localhost机器上可见(使用Wireshark测试)并且smarthpone或其他PC无法接收它们。我试图关闭Windows防火墙和防病毒但不工作。我不知道为什么数据包没有在网络上正确重定向。也许我的代码有些错误?谢谢你。
答案 0 :(得分: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