DatagramSocket 在 Android 7.0 上发送块

DatagramSocket send blocks on Android 7.0

我在 Android 应用程序中使用 DatagramSocket 与服务器进行一些 UDP 通信。它向服务器发送数据包并侦听来自服务器的数据包。这是大约四年前创建的,并且一直运行良好。一位客户最近将平板电脑升级到 Android 7.0,现在 DatagramSocket.send(DatagramPacket) 会无限期阻塞而不发送任何内容。

我已经尝试了下面的测试代码来演示这个问题。在至少 6.0.1 之前的所有 Android 版本中,以下代码按预期工作。接收方法 运行ning 在一个单独的线程中,阻塞等待数据包。发送方法立即完成并继续执行。如果我 运行 在 7.0 上执行此操作,发送方法会阻塞并且不会发送任何内容。

我没有收到任何安全异常。我一直在尝试查找描述对 Android 或 DatagramSocket 的相关更改的文档,但尚未找到任何内容。如果我不调用接收方法,发送方法不会阻塞。

我尝试使用两个 DatagramSocket 实例来解决这个问题:一个发送,一个接收。但是来自服务器的响应需要返回到同一个端口,我看不出有什么方法可以用两个套接字实现这一点。

所以我的问题是,为什么现在会发生这种情况?我现在需要在 Android 7.0 中做一些新的事情吗?或者,还有另一种方法可以解决这个问题吗?

try {
    final DatagramSocket socket = DatagramChannel.open().socket();
    socket.bind(null);
    DatagramPacket packet = new DatagramPacket(new byte[100], 100, new InetSocketAddress("my.server.com", 31000));
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                DatagramPacket receivedPacket = new DatagramPacket(new byte[100], 100);
                socket.receive(receivedPacket);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
    Thread.sleep(1000);
    socket.send(packet);
    socket.close();
} catch (Exception e) {
    e.printStackTrace();
}

经过反复试验,我终于通过以下代码更改解决了这个问题。我不确定 Android 7 中的 DatagramChannel 发生了什么变化,但我真的不需要它。

//final DatagramSocket socket = DatagramChannel.open().socket();
//socket.bind(null);
final DatagramSocket socket = new DatagramSocket();