簡體   English   中英

DatagramSocket在Android 7.0上發送塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM