簡體   English   中英

UDP套接字在Android 6(M)上不接收數據報

[英]UDP socket does not receive datagrams on Android 6 (M)

我的以下代碼在Android 5.1.1上運行良好,顯示了在控制台上收到的數據報。

byte[] message = new byte[500];
try {
    String text;
    int server_port = 3421;
    DatagramPacket p = new DatagramPacket(message, message.length);
    DatagramSocket s = new DatagramSocket(server_port);

    s.receive(p);
    Log.d("APP", "After received");

    final String hexMsg = bytesToHex(message);
    Log.d("APP","message:" + hexMsg);

    s.close();
} catch (SocketException e) {
    e.printStackTrace();
} catch (UnknownHostException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {

}

由於某些未知原因,當我在Android 6.0.1上運行相同的代碼時,我沒有收到任何數據報。 控制台上未顯示任何錯誤。

我的UDP服務器正在將數據報直接發送到我的android設備(因此,它不是廣播)。

完整的課程代碼:

 public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            if (Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1) {
                String pkg=getPackageName();
                PowerManager pm=getSystemService(PowerManager.class);

            if (!pm.isIgnoringBatteryOptimizations(pkg)) {
                Intent i= new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
                                .setData(Uri.parse("package:" + pkg));

                startActivity(i);
            }
        }

        new myAsync().execute();

    }

    final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
    public static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for ( int j = 0; j < bytes.length; j++ ) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }

    class myAsync extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

            byte[] message = new byte[500];
            try {
                String text;
                int server_port = 3421;
                DatagramPacket p = new DatagramPacket(message, message.length);
                DatagramSocket s = new DatagramSocket(server_port);

                s.receive(p);
                Log.d("APP", "After received");

                final String hexMsg = bytesToHex(message);
                Log.d("APP","message:" + hexMsg);


                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),  hexMsg, Toast.LENGTH_LONG).show();
                    }
                });


                s.close();
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {

            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            // Handle/Update UI Part
        }
    }
}

關於可能是什么問題的任何想法?

通過進行2次更改,我使其能夠工作:

1st)通過使用以下方式允許重復使用地址:

DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress(server_port));

代替

DatagramSocket s = new DatagramSocket(server_port);

2)使用可運行線程而不是異步方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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