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();
我在 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();