微信小程序Android真机WebSocket连接失败

写了一个小程序需要用到WebSocket技术,在微信web开发者工具上测试没有问题,在IOS机器上测试没有问题,很开心发给用Android手机的朋友看看,问题就出现了…

问题

写了一个小程序需要用到WebSocket技术,在微信web开发者工具上测试没有问题,在IOS机器上测试没有问题,很开心发给用Android手机的朋友看看,问题就出现了,叫他打开调试模式,WebSocket报出的错误是

1
errMsg:"connect response time out"

然后我也搞部Android手机,而我报出的错误是

1
errMsg:"draft refuses handshakenot found"

分析

因为小程序的体验版是需要已经备案的域名,并且是需要https和wss的,所以使用了内网穿透,让外网可以连接到本机,而本机的操作系统是Wind10,再使用nginx反向代理到用Go语言写的服务端程序。

查了一下,有人说,如果是IOS可以,而Android上不行,或者反过来Android可以,IOS上不行,那么有可能是https证书问题。

然后我试了https://freessl.org/上生成的3种不同证书,还有阿里云上生成的Symantec证书,还是不行。

也有人说,小程序的https证书是需要支持TLSv1.2的,但用https://www.ssllabs.com/ssltest/index.html检测,我的证书是支持的,TLSv1.2有系统要求,但win10也是支持的。

本来还想试试部署到Ubuntu系统上看看,但觉得部署太麻烦了,还是从小程序的代码入手吧。

因为我使用小程序的SocketTask例子,那么先改成原本的WebSocket例子,而为了不修改原来的业务代码,我新增一个响应WebSocket请求的接口,用Android手机测试,连接成功了!!!难道是SocketTask和WebSocket的问题,那么用WebSocket替换SocketTask请求原本的接口,连接不成功–!用SocketTask连接新增的接口,连接成功–!我得到一个猜测,是我的Url有问题,为了不让别人随便成功创建WebSocket链接,我要求在Url上加上一个token,只有token通过验证才会将http请求升级为WebSocket,但这个token太长了,导致Android手机能请求,但创建WebSocket链接失败,晕死了,还有这样的操作~

解决方案

好在小程序的创建WebSocket的Api是可以自定义Header的,所以就把token放在Header中了,而后端也可以获取到token。一般浏览器创建WebSocket的Api是不支持自定义Header的。

总结

写个小Demo,将问题范围缩小,能更好定位到问题的所在。

另外希望W3C组织能把创建WebSocket的Api支持自定义Header的。

觉得文章对您有帮助,请我喝瓶肥宅快乐水可好 (๑•̀ㅂ•́)و✧
  • 本文作者: 阿彬~
  • 本文链接: https://iweixubin.github.io/posts/websocket-draft-refuses-handshake/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 免责声明:本媒体部分图片,版权归原作者所有。因条件限制,无法找到来源和作者未进行标注。
         如果侵犯到您的权益,请与我联系删除