亲爱的琦先生 2022-09-23 09:45 采纳率: 0%
浏览 38
已结题

在使用uniapp开发中,使用DatagramSocket的receive()方法接收数据,会造成阻塞。

问题遇到的现象和发生背景

在使用uniapp开发中,使用DatagramSocket的receive()方法接收数据,会造成阻塞。

用代码块功能插入代码,请勿粘贴截图

//引入需要用到的安卓包
let DatagramPacket = plus.android.importClass('java.net.DatagramPacket'); //udp接收信息引用的java类
let DatagramSocket = plus.android.importClass('java.net.DatagramSocket'); //udp创建udp引用java类
let InetAddress = plus.android.importClass('java.net.InetAddress'); //绑定ip引用java类
let NetworkInterface = plus.android.importClass('java.net.NetworkInterface'); //获取主机ip
let JString = plus.android.importClass('java.lang.String'); //字符串转换类

                    let port = that.port; //广播端口
                    let getPort = that.getPort; //本机端口
                    let timeout = 5000; //超时时间
                    let address = that.ip;
                    let getData = [];

                    try {

                        if (DatagramSocket == undefined) {
                            return;
                        }

                        let ip = InetAddress.getByName(address);

                        // 绑定本机接收UDP反馈消息的端口号
                        that.socket = new DatagramSocket(getPort);

                        // 设置接收超时时长   
                        that.socket.setSoTimeout(timeout);

                        // 接收数据
                        let isReceive = true;
                        while (isReceive) {
                            try {
                                // 设置接收缓存,需要用0填充,否则为 null 无法接收。   
                                let buffer = new Array(1024).fill(0);
                                let packet = new DatagramPacket(buffer, buffer.length);

                                that.socket.receive(packet);

                                let data = new JString(packet.getData()).trim();
                                if (data.length == 0) {
                                    // 接收超时,结束接收  
                                    isReceive = false;
                                } else {
                                    console.log('=====收到数据======', data);
                                    getData.push(data)
                                }

                            } catch (ex) {
                                that.socket.close();
                                isReceive = false;
                                console.log('接收数据失败:' + ex)
                            }
                        }

                    }

                } catch (ex) {
                    console.log('========出错了=======', ex);

                } finally {
                    if (that.socket != undefined) {
                        that.socket.close();
                    }
                }
运行结果及报错内容

会造成页面卡死

我的解答思路和尝试过的方法

我尝试将方法写成异步,但执行到receive()依旧会阻塞。想通过多线程来解决,不知道有没有办法多开一个线程
我将它放入reactjs中,报错:android.os.NetworkOnMainThreadException;at java.net.DatagramSocket.receive

我想要达到的结果

因为这是要实时监听设备信息,所以要轮询,我希望可以一直执行这个方法并不会造成线程阻塞

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月1日
    • 创建了问题 9月23日

    悬赏问题

    • ¥15 socket通信实现多人聊天室疑惑
    • ¥15 DEV-C++编译缺失
    • ¥33 找熟练码农写段Pyhthon程序
    • ¥100 怎么让数据库字段自动更新
    • ¥15 antv g6 力导向图布局
    • ¥15 quartz框架,No record found for selection of Trigger with key
    • ¥15 锅炉建模+优化算法,遗传算法优化锅炉燃烧模型,ls-svm会搞,后面的智能算法不会
    • ¥20 MATLAB多目标优化问题求解
    • ¥15 windows2003服务器按你VPN教程设置后,本地win10如何连接?
    • ¥15 求一阶微分方程的幂级数