我正在尝试实现我的应用程序能够接收一些广播消息。一台设备向 192.168.2.255 发送消息。我可以在 Wireshark 上看到这有效。我的应用程序应该会收到这些消息,但它还不起作用。这是我的代码:
int port = 3123;
// Create a socket to listen on the port.
DatagramSocket dsocket = new DatagramSocket(port);
dsocket.setBroadcast(true);
// Create a buffer to read datagrams into. If a
// packet is larger than this buffer, the
// excess will simply be discarded!
byte[] buffer = new byte[1024];
// Create a packet to receive data into the buffer
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// Now loop forever, waiting to receive packets and printing them.
while (true) {
// Wait to receive a datagram
dsocket.receive(packet);
// Convert the contents to a string, and display them
String msg = new String(buffer, 0, packet.getLength());
System.out.println(packet.getAddress().getHostName() + ": " + msg);
// Reset the length of the packet before reusing it.
packet.setLength(buffer.length);
res = msg;
Log.d("mainGate_bc", res);
}
} catch (Exception e) {
System.err.println(e);
}
Run Code Online (Sandbox Code Playgroud)
程序卡在 dsocket.receive(packet) 行上。当其他设备发送数据包时,我的应用程序中没有任何内容到达。
我尝试过这些权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
Run Code Online (Sandbox Code Playgroud)
知道为什么它不起作用吗?一些进一步的权限?Android 设备上的设置?
这个问题与另一个问题重复。 显然,除非您获得多播锁,否则广播数据包都会被过滤掉。
所以你需要类似下面的代码:
WifiManager wm = null;
MulticastLock multicastLock = null;
@Override
protected void onResume() {
super.onResume();
if(wm == null)wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
if(multicastLock == null){
multicastLock = wm.createMulticastLock("stackoverflow for the win");
multicastLock.setReferenceCounted(true);
}
if(multicastLock != null && !multicastLock.isHeld()) multicastLock.acquire();
}
@Override
protected void onPause() {
super.onPause();
if(multicastLock != null && multicastLock.isHeld()) multicastLock.release();
}
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2791 次 |
| 最近记录: |