亲爱的琦先生 2022-09-21 13:09 采纳率: 0%
浏览 31

最近在做一个UDP广播,并接收反馈信息进行显示输出,设置的超时时间是6秒,但在接收反馈信息的6秒中,我不能进行其它的操作,我必须等6秒结束才能操作其它数据

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

最近在做一个UDP广播,并接收反馈信息进行显示输出,设置的超时时间是6秒,但在接收反馈信息的6秒中,我不能进行其它的操作,我必须等6秒结束才能操作其它数据。应该是线程阻塞的问题,DatagramSocket的receive()方法会阻塞线程,请问有什么办法可以解决吗?在uniapp中

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

return new Promise((resolve, reject) => {
                    console.log("----------------------- bindBroadcast -----------------------")
                    //引入需要用到的安卓包
                    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 socket;
                    let port = that.port; //广播端口
                    let getPort = that.getPort; //本机端口
                    let timeout = 6000; //超时时间
                    let address = that.ip;
                    let getData = [];

                    try {

                        if (DatagramSocket == undefined) {
                            return;
                        }
                        // 创建广播地址 
                        let ip = InetAddress.getByName(address);

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

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

                        // 发送广播数据                     
                        let sendData = Array.prototype.slice.call((new Buffer(`hello server`)), 0);
                        let sendPacket = new DatagramPacket(sendData, sendData.length, ip, port);
                        console.log('广播地址:' + ip.getHostAddress(), '端口号:' + sendPacket.getPort())
                        socket.send(sendPacket);

                        // 接收数据
                        let isReceive = true;

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

                                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) {
                                socket.close();
                                isReceive = false;
                                console.log('接收数据失败:' + ex.message)
                            }
                        }
                    } catch (ex) {
                        console.log('========出错了=======', ex);

                    } finally {
                        if (socket != undefined) {
                            socket.close();
                        }
                        return resolve(getData)    
                    }
                })

我想要达到的结果

我想要在这个方法执行时,我可能操作别的方法。我尝试将它写成异步的方法,但还是不行

  • 写回答

2条回答 默认 最新

  • nssnail 2022-09-21 20:05
    关注

    异步不行的原因是什么

    评论

报告相同问题?

问题事件

  • 修改了问题 9月21日
  • 创建了问题 9月21日

悬赏问题

  • ¥100 c语言,请帮蒟蒻看一个题
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)