[英]Send and receive using Datagramsocket simultaneously in Android - Just send?
[英]DatagramSocket send blocks on Android 7.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();
}
經過反復試驗,我終於通過以下代碼更改解決了此問題。 我不確定Android 7的DatagramChannel中發生了什么變化,但是我還是真的不需要它。
//final DatagramSocket socket = DatagramChannel.open().socket();
//socket.bind(null);
final DatagramSocket socket = new DatagramSocket();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.