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

标签 java android sockets

这个问题在这里已经有了答案:





How can I fix 'android.os.NetworkOnMainThreadException'?

(66 个回答)


6年前关闭。




我正在尝试创建一个简单的应用程序,它将接收来自 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();

    }

}

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

最佳答案

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

关于java - 为什么我的简单应用程序没有收到 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30403639/

相关文章:

java - 判断 JDialog 是否已经打开

java - Android webview 上的进度条

java - DocumentFilter:为什么调用 replace() 而不是 insertString()?

android - 为数据库处理创建数据模型类

java - 处理终止套接字 "client"的正确方法是什么

java - 如何调用接受字符串的方法?

android - 使用 ksoap2 从 Android 发送图像到网络服务

android - Intellij Android 项目架构 URI 未注册?

java - 使用java在三个服务器之间进行UDP单播通信

sockets - ClankBundle 不会触发订阅