Android Multicast超时问题

时间:2018-02-12 21:48:33

标签: android multicast multicastsocket

我正在开发一款Android应用程序,它将从已经在239.255.x.x上输出可靠多播数据的网络接收多播数据包。我已经验证我的设备可以使用其他应用程序接收多播。我是Java和Android的新手,但我确认我收集多播信息的原始代码在java应用程序中工作,并且一直在努力让所有东西都在Android方面工作。我在清单中设置了权限,

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

代码的网络部分在Asynctask中运行,以免崩溃应用程序,但我的Multicast.receive()调用所有结果导致超时。我还缺少其他东西或阻止多播套接字工作的东西asynctask类?

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


    final Button button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
          new getACN.execute();
        }
    });


}

 public class getACN extends AsyncTask<Void, Void, String> {



    @Override
    public String doInBackground(Void... Void) {
        byte[] buf = new byte[1000];


            try {
                WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
                MulticastLock multicastLock = wifiManager.createMulticastLock("sACN");

                multicastLock.acquire();




                InetAddress group = InetAddress.getByName("239.255.0.3");
                DatagramPacket recv = new DatagramPacket(buf,buf.length);

                MulticastSocket sock = new MulticastSocket(5568);

                sock.joinGroup(group);

                sock.setSoTimeout(1000);
                sock.receive(recv);
                sock.leaveGroup(group);

            } catch (IOException e) {


                return e.getMessage();


            } catch (SecurityException e) {
                return  e.getMessage();


            }
            return Arrays.toString(buf);

    }

    @Override
    protected void onPostExecute(String result){
        TextView textView = (TextView) findViewById(R.id.text01);
        textView.setText(result);
    }

}

}

0 个答案:

没有答案