Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android上接收广播数据包_Android_Broadcast - Fatal编程技术网

如何在android上接收广播数据包

如何在android上接收广播数据包,android,broadcast,Android,Broadcast,我正在尝试实现我的应用程序能够接收一些广播消息。一台设备向192.168.2.255发送消息。我在Wireshark上看到了这一点。我的应用程序应该会收到这些消息,但尚未运行。这是我的代码: int port = 3123; // Create a socket to listen on the port. DatagramSocket dsocket = new DatagramSocket(port); dsocket.setBroadcas

我正在尝试实现我的应用程序能够接收一些广播消息。一台设备向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);
    }
该程序卡在dsocket.receive(数据包)线上。当另一台设备发送数据包时,我的应用程序中没有任何内容

我尝试了以下权限:

<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>


知道它为什么不起作用吗?还有其他权限吗?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" />
WifiManager wm=null;
MulticastLock MulticastLock=null;
@凌驾
受保护的void onResume(){
super.onResume();
if(wm==null)wm=(WifiManager)getSystemService(Context.WIFI_服务);
if(多播锁==null){
multicastLock=wm.createMulticastLock(“stackoverflow for the win”);
multicastLock.setReferenceCounted(真);
}
if(multicastLock!=null&&!multicastLock.ishell())multicastLock.acquire();
}
@凌驾
受保护的void onPause(){
super.onPause();
if(multicastLock!=null&&multicastLock.ishell())multicastLock.release();
}

谢谢,但结果相同。代码是否克服了对
receive()
的阻塞调用?如果没有,请查看以定期中断阻塞调用。它不会。但我也不想打断你的接收。我想接收似乎没有到达我的应用程序的现有消息。请尝试
DatagramSocket dsocket=new DatagramSocket(null);dsocket.setReuseAddress(真);dsocket.Roadcast(真实);绑定(新的InetSocketAddress(端口))很遗憾,没有更改。