写了一个小程序需要用到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的。