Java 为什么我的简单应用程序不接收UDP数据包

Java 为什么我的简单应用程序不接收UDP数据包,java,android,sockets,Java,Android,Sockets,我试图创建一个简单的应用程序,将接收来自WiFi模块的UDP数据包。WiFi模块每5秒发送一个数据包,但我一直无法成功接收 使用Toast作为调试的一种方式,我以正确的顺序接收它们,直到“这里也没有收到”,这告诉我问题出在“socket.receive(packet)”行 有人知道为什么它可能不起作用吗?我还通过在线查看大量问题/示例来尝试代码的变体,但它们都会导致“socket.receive(packet)”行出现问题 另外,我编写了一个python脚本来做同样的事情,在同一个端口上查找UD

我试图创建一个简单的应用程序,将接收来自WiFi模块的UDP数据包。WiFi模块每5秒发送一个数据包,但我一直无法成功接收

使用Toast作为调试的一种方式,我以正确的顺序接收它们,直到“这里也没有收到”,这告诉我问题出在“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();

    }

}

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

正如您所说,存在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();

您是否已将
添加到AndroidManifest.xml中?另外,您能在
catch
block中打印出
i.toString()
吗?pelya,我有权限声明,我刚刚添加了i.toString()。i.toString()的结果是:2!android.os.NetworkOnMainThreadExceptionEkant Sharma最初在没有超时功能的情况下尝试了这个功能,因为我知道它默认为无限,但它仍然不起作用,所以我添加了这个功能来使用它。