Android Udp:如何从LAN接收datagramPacket

时间:2013-09-25 22:12:05

标签: android udp client lan datagram

我有一个用C语言编写的UDP服务器,每隔5秒在端口3001上通过我的LAN广播一个paquets。

我正在创建一个作为UDP客户端的android应用程序,它正在侦听端口3001(在AsyncTask线程中)并且它一直在运行,直到receive()方法,似乎没有检测到数据端口。

这是我的代码:

private class ConnectionTask extends AsyncTask<Void, Integer, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... arg0) {

        String receivedString = "";

        byte[] receiveData = new byte[1024];

        DatagramSocket clientSocket;
        try {
            while(true){
                clientSocket = new DatagramSocket(5000);
                DatagramPacket receivePacket = new DatagramPacket(receiveData,
                        receiveData.length);
                clientSocket.receive(receivePacket);
                receivedString = new String(receivePacket.getData());
            }


        } catch (SocketException e) {
            Log.v("SocketExceptionOccured", e.toString());
            e.printStackTrace();
            //clientSocket.close();
        } catch (IOException e) {
            Log.v("IOExceptionOccured", e.toString());
            e.printStackTrace();
            //clientSocket.close();
        }

        Toast.makeText(getBaseContext(), receivedString, Toast.LENGTH_LONG)
                .show();

        return null;

    }

}

我使用自己的设备测试我的代码以进行调试,使用USB线。

我使用在我的计算机上运行的简单UDP客户端(在C中)测试了我的服务器,并且通信正常。

我不知道为什么这段代码不起作用。有人有想法吗?

谢谢,

3 个答案:

答案 0 :(得分:0)

你永远不会离开while循环。你可能收到了消息,然后循环导致datagramsocket再次监听。

答案 1 :(得分:0)

每次循环时都不要创建和关闭套接字。先创建它然后关闭它。目前存在套接字不存在的时间窗口,因此丢弃了数据报:每次关闭时都会丢弃所有排队的数据报。

答案 2 :(得分:0)

我有同样的问题。您需要在android清单中添加权限

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

还在套接字中启用广播。

clientSocket.setBroadcast(true);

像我之前提到的其他人一样,你的代码也永远不会离开while循环,因此它永远不会进入toast显示的行。记住你不能显示来自doInBackground的Toast消息,因为这是访问UI Thread,你只能通过postExecute和preExecute函数这样做。这将导致您的应用程序崩溃。要检查收到的数据,您可以调试它或记录它。

你的最终doInBackground应该是这样的

@Override
protected Void doInBackground(Void... arg0) {

    String receivedString = "";

    byte[] receiveData = new byte[1024];

    DatagramSocket clientSocket;
    try {
        while(true){
            clientSocket = new DatagramSocket(5000);
            DatagramPacket receivePacket = new DatagramPacket(receiveData,
                    receiveData.length);
            clientSocket.setBroadcast(true);
            clientSocket.receive(receivePacket);
            receivedString = new String(receivePacket.getData());
            Log.i("Received String= "+receivedString);
        }


    } catch (SocketException e) {
        Log.v("SocketExceptionOccured", e.toString());
        e.printStackTrace();
        //clientSocket.close();
    } catch (IOException e) {
        Log.v("IOExceptionOccured", e.toString());
        e.printStackTrace();
        //clientSocket.close();
    } finally{
        if(clientSocket!=null){
           clientSocket.close();
        }
    }

    return null;

}

现在,当您检查日志时,您应该能够看到收到的字符串的值。