为什么我的简单应用程序没有收到UDP数据包

时间:2015-05-22 18:35:24

标签: java android sockets

我正在尝试创建一个简单的应用程序,它将从WiFi模块接收UDP数据包。 WiFi模块每5秒发送一次数据包,但我无法成功接收数据包。

使用toasts作为一种调试方式,我按照正确的顺序接收它们,直到“不要在这里得到它”,这告诉我问题在于'socket.receive(packet)'线。

有没有人知道为什么它可能不起作用?我也通过在线查看很多问题/示例尝试了代码的变体,但它们仍然导致'socket.receive(packet)'行的问题。

另外,我编写了一个python脚本来做同样的事情,在同一个端口上查找UDP数据包,并使用QPython运行它,它确实收到了数据包,所以看起来这些数据包是由WiFi模块发送的,并且由平板电脑接收,只是应用程序不会出于某种原因读取数据。

非常感谢任何帮助或见解,谢谢。

以下是代码:

public void run() {

    Toast.makeText(this, "RIGHT BEFORE TRY", Toast.LENGTH_LONG).show();

    DatagramSocket socket;
    DatagramPacket packet;


   try {
        Toast.makeText(this, "IN THE TRY", Toast.LENGTH _LONG).show();
        socket = new DatagramSocket(9750);
        byte[] buf = new byte[1024]; //buffer
        socket.setSoTimeout(100000);
        Toast.makeText(this, "Timeout is: " + socket.getSoTimeout(), Toast.LENGTH_LONG).show();
        //DatagramPacket packet = new DatagaramPacket(buf, buf.length);
        //Toast.makeText(this, "PACKET SIZE IS: "+buf.length, Toast.LENGTH_LONG).show();

        // while(true) {
        Toast.makeText(this, "IN THE WILD!", Toast.LENGTH_LONG).show();
        packet = new DatagramPacket(buf, buf.length);
        Toast.makeText(this, "PACKET SIZE IS: " + buf.length, Toast.LENGTH_LONG).show();

        try {
            //socket.receive(packet);
            socket.receive(packet);
            Toast.makeText(this, "GOT SOMETHING!", Toast.LENGTH_LONG).show();
        }
        catch (Exception i) {
            // TODO Auto-generated catch block
            //i.printStackTrace();
            Toast.makeText(this, "DIDN'T GET IT HERE EITHER!", Toast.LENGTH_LONG).show();
        }
        //byte[] result = new byte[packet.getLength()];
        byte[] result = packet.getData();
        System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
        String msg = new String(result);
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
        Toast.makeText(this, "END WHILE!", Toast.LENGTH_LONG).show();
        //}

    } catch (Exception e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
        Toast.makeText(this, "DIDN'T GET IT!", Toast.LENGTH_LONG).show();

    }

}

更新:在前两个答案之后,看起来我们试图在主线程中进行网络操作,这是不可行的,所以我们目前正在尝试用另一个线程或异步任务来实现它。希望有一些好消息:)

1 个答案:

答案 0 :(得分:0)

如你所说有NetworkOnMainThread异常,你只需要把这个问题放在新线程上并启动它......

Thread thread = new Thread() {
    @Override
    public void run() {
Toast.makeText(this, "RIGHT BEFORE TRY", Toast.LENGTH_LONG).show();

    DatagramSocket socket;
    DatagramPacket packet;


   try {
        Toast.makeText(this, "IN THE TRY", Toast.LENGTH _LONG).show();
        socket = new DatagramSocket(9750);
        byte[] buf = new byte[1024]; //buffer
        socket.setSoTimeout(100000);
        Toast.makeText(this, "Timeout is: " + socket.getSoTimeout(), Toast.LENGTH_LONG).show();
        //DatagramPacket packet = new DatagaramPacket(buf, buf.length);
        //Toast.makeText(this, "PACKET SIZE IS: "+buf.length, Toast.LENGTH_LONG).show();

        // while(true) {
        Toast.makeText(this, "IN THE WILD!", Toast.LENGTH_LONG).show();
        packet = new DatagramPacket(buf, buf.length);
        Toast.makeText(this, "PACKET SIZE IS: " + buf.length, Toast.LENGTH_LONG).show();

        try {
            //socket.receive(packet);
            socket.receive(packet);
            Toast.makeText(this, "GOT SOMETHING!", Toast.LENGTH_LONG).show();
        }
        catch (Exception i) {
            // TODO Auto-generated catch block
            //i.printStackTrace();
            Toast.makeText(this, "DIDN'T GET IT HERE EITHER!", Toast.LENGTH_LONG).show();
        }
        //byte[] result = new byte[packet.getLength()];
        byte[] result = packet.getData();
        System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
        String msg = new String(result);
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
        Toast.makeText(this, "END WHILE!", Toast.LENGTH_LONG).show();
        //}

    } catch (Exception e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
        Toast.makeText(this, "DIDN'T GET IT!", Toast.LENGTH_LONG).show();

    }


    }
};
thread.start();