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