首页 文章

DatagramSocket在Android 7.0上发送块

提问于
浏览 113
0

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

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

我没有得到任何安全例外 . 我一直在尝试找到描述Android或DatagramSocket相关更改的文档,但还没有找到任何内容 . 如果我不调用receive方法,send方法不会阻塞 .

我尝试使用两个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();
}

1 回答

  • 0

    经过一些试验和错误,我终于通过下面的代码更改解决了这个问题 . 我不确定Android 7中的DatagramChannel有什么变化,但我还是不需要它 .

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

相关问题