剑网PHP
剑网PHP
  • 发布:2019-07-11 09:36
  • 更新:2024-12-04 20:24
  • 阅读:16271

uni.connectSocket 连接成功,但uni.onSocketOpen没有触发到(ios,android)但在H5是正常的。

分类:uni-app

如题所述。
uni.connectSocket 返回的是:{"socketTaskId":1,"errMsg":"connectSocket:ok"}
但之后的 uni.onSocketOpen没有触发。

             initSocket(){   
                let that=this;  
                var verifyData=JSON.stringify({  
                  msg: "init",  
                  data:this.noticeSession,  
                })  
                this.ws = uni.connectSocket({                     
                    url: that.socket_url,protocols:["echo-protocol"],complete: (res)=> {console.log(res)}  
                });  

                uni.onSocketOpen(function (res) {  
                    that.socketOpen=true;  
                    console.log('WebSocket connect Server.');  
                    //提交检验数据  
                    uni.sendSocketMessage({data:verifyData});  
                });  

                uni.onSocketMessage(function (res) {  
                    console.log('WebSocket receive messages.');  
                    that.dataEvent(res.data);  
                });    

                uni.onSocketClose(function (res) {  
                    that.socketOpen=false;  
                    that.ws =null;  
                    console.log('WebSocket close.');                      
                });  
            }
2019-07-11 09:36 负责人:无 分享
已邀请:
小巷而已

小巷而已 - 小巷

我解决了!
在connectSocket连接时,GET参数包含 | ,对就是有竖线,就不行...

  • 微桔智能

    参数里面怎么不包含 | 呢,我data里面放了空的,就是ios app里面无法opensocket

    2019-11-11 18:21

  • 小巷而已

    回复 微桔智能: 原来是 wss://xxxxx?a=1|2|3 就不行,因为有 | ,你看看是不是参数有其它特殊字符也不支持

    2019-11-12 15:17

  • 5***@qq.com

    有用,参数不能包含|,不然ios就不触发

    2022-07-03 12:37

剑网PHP

剑网PHP (作者)

H5正常的,真机测试就不灵了

小巷而已

小巷而已 - 小巷

我也是,H5和安卓APP都行,IOS APP就是不触发!!!

  • 1***@qq.com

    大佬解决了吗

    2020-06-28 10:38

  • 我会很认真

    大佬解决了吗 我也是ios不触发

    2020-09-03 16:31

  • 1***@qq.com

    有解决么?我也是只有ios不触发

    2022-01-10 16:19

  • 5***@qq.com

    回复 1***@qq.com: 伙计解决了吗

    2022-08-04 17:18

1***@qq.com

1***@qq.com - fighting

请问怎么解决的?

1***@qq.com

1***@qq.com - 90后IT小学生,热爱学习

求大佬站出来指点一二?uni.connectSocket 连接成功,但uni.onSocketOpen没有触发到android 但在H5是正常的。

  • DCloud_Android_zl

    升级到最新版试一下

    2019-10-28 17:41

  • 1***@qq.com

    回复 DCloud_Android_zl: 版本问题? 我也觉得是的.感谢大佬给的甩锅提示.大佬你们这个控制台打印是不是需要调整下,触发onSocketError的返回值居然是[Object,Object],转json字符串是{}.我怎么分析报错.不懂可以看下,我下面的回复,有图片的哦!

    2019-11-04 09:06

  • 5***@qq.com

    老铁怎么解决的

    2022-08-05 10:42

1***@qq.com

1***@qq.com

你好,我的HBuilderX是最新版的了,但是还是会存在uni.onSocketOpen没有触发到在h5端,猜测问题是我开启多个webSocket时,关闭并重新打开某个webSocket链接时就会出现uni.onSocketOpen没有触发的现象。

1***@qq.com

1***@qq.com - 90后IT小学生,热爱学习

PC浏览器Ok,安卓手机G了. 然后onSocketError回调给我打印个{},我也是醉了.

  • 1***@qq.com

    暂时解决办法: 用puls-websocket插件

    2019-11-04 16:29

  • DCloud_Android_zl

    回复 1***@qq.com: 提供一个socket链接,我试一下。

    2019-11-06 11:28

  • 3***@qq.com

    回复 1***@qq.com: 没有用啊,什么情况

    2019-12-02 19:16

  • snail_lt

    回复 DCloud_Android_zl: 你好,真的不行,在ios完全无响应

    2020-04-01 15:42

  • Gfly

    我iOS用plus-websocket在基座包运行是没问题的,但是打成ipa包安装到手机就有问题了,连uni.connectSocket都进入不了

    2020-11-23 11:19

  • c***@163.com

    回复 Gfly: 解决了吗?

    2021-02-04 16:08

  • 1***@qq.com

    回复 c***@163.com: 解决了吗?

    2022-06-27 10:44

1***@qq.com

1***@qq.com - 全栈开发

我遇到相同的问题onSocketOpen不触发,onSocketError也不触发
安卓和ios是一样的问题,H5报错
请问这个问题怎么解决?

w***@163.com

w***@163.com - 90后

怎么解决这个问题 ?

一乐

一乐 - 喜欢骑摩托。做了12年即时通讯IM,多个千万级并发服务

我也遇到了这个问题,原因猜测应该是,因为 websocket 复用了底层的 tcp 链接,所以它认为自己并没有重新打开 socket,也因此不会触发 onSocketOpen 事件。

如果你像我们一样,在使用 websocket 的时候,把应用初始化的工作放在 onSocketOpen 里,就会遇到这样的问题。

解决方案是,把初始化工作挪到 socket.connect 的 success 方法中。

  • 1***@qq.com

    您好 能麻烦贴下您的代码吗?

    2020-07-29 10:51

  • 一乐

    回复 1***@qq.com: 没啥可贴的。。就是原来等待事件后的业务处理函数,从 onSocketOpen 挪到了 connectSocket 的 success 里面。


    wx.connectSocket({

    url: fireplace,

    success: () => {

    onConnect();

    },

    fail: err => {

    connectError(err);

    }

    });

    2020-07-29 15:27

  • 1***@qq.com

    回复 一乐: 多谢

    2020-07-30 16:11

蜡笔小新人

蜡笔小新人

APP连接不上。

H5可以连接成功

  • navi

    最新开发版,我也是遇到一样的问题,兄弟你那边解决了吗?

    2021-10-20 19:22

  • 蜡笔小新人

    还没有解决。这个我打算重构了, 有兴趣一起研究吧

    2021-11-11 11:00

山上的猪

山上的猪 - 每一天都有更好的自己

Android不行

bcf_001

bcf_001

我遇到这个问题解决了!
我遇到的这个问题只在iOS系统里有,安卓、h5都正常。
在connectSocket连接时,GET参数包含的有特殊符号 如: 空格、|等,会出现这问题。我的是ws url后跟的参数值里有空格,导致 Socket 链接成功但是打不开,消息也收发不了。我把空格去掉就行了。

h***@163.com

h***@163.com - 八十

我这个使用ws就可以监听到onSocketOpen回调,使用wss就不行
很奇怪

  • ke_huifeng

    最后怎么解决的,大佬

    2023-07-24 10:57

2***@qq.com

2***@qq.com

WebSocket 连接
h5 报错
videoHosting.vue?fc36:243 WebSocket connection to 'wss://192.168.110.19:8024/api/platform/websocket/1111' failed: Error in connection establishment: net::ERR_CERT_AUTHORITY_INVALID
app 报错
TypeError: WebSocket is not a constructor

3***@qq.com

3***@qq.com

h5,后端重启服务,socket正常重连,APP,uni.connectSocket成功之后,this.socketTask.onOpen不触发

6***@qq.com

6***@qq.com

我发现我真机测试是:热刷新后就监听不到了,需要重新刷机才能监听。

zu

zu

我本地连接安卓测试 已 解决,现象如下:
uni.connectSocket({
url: 'ws://192.168.31.35:12306/webSocket'})

uni.onSocketOpen 未被调用问题 H5没问题,安卓有问题,
原因 之前ws地址我写的是127.0.0.1 后面改成了 本地电脑ip 192.168.31.35成功连接
cmd 看本地ipv4地址

l***@messagesit.com

l***@messagesit.com

我也遇到这样的问题,有大佬看到后回复一下谢谢

5***@qq.com

5***@qq.com

解决了。 看官方文档说,小程序必须使用wss://协议。

1.首先确定域名已经配置ssl。 然后前端websocket url 使用wss:// 协议地址。

  1. 在nginx 中添加指向配置,确保websocket 的端口被指向了ssl 的端口,如443. 在我的案例中,我的websocket 指向的是2348端口。ecs中同时已经设置了出入安全组规则(未验证过到底要不要,反正先设置)。

WebSocket 代理

location /ws/ {  
    proxy_pass http://localhost:2348;  # 假设你的 WebSocket 服务器在 2348 端口  
    proxy_http_version 1.1;  
    proxy_set_header Upgrade $http_upgrade;  
    proxy_set_header Connection "upgrade";  
    proxy_set_header Host $host;  
    proxy_set_header X-Real-IP $remote_addr;  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
    proxy_set_header X-Forwarded-Proto $scheme;  
}  
  1. ngink 中添加了代理之后, 前端url 需要修改为“ wss:// xxx.xxx.com/ws/”

  2. 重启nginx. 然后 onSocketOpen 就可以正常打开了.

希望对大家有帮助。

q***@xyylb.com

q***@xyylb.com

我也是APP端onError报错{},把uni.connectSocket换成plus.connectSocket,换个手机终于出报错了,调了4个多小时,然后用https,并且后端开启允许跨域,终于解决了,特地来回复下。
总结:
1.要用https
2.后端允许跨域
3.uni.connectSocket换成plus.connectSocket

要回复问题请先登录注册