这周五应领导要求第二次去了上海电气解决技术上的问题。周四接到通知说是电气那边同事遇到个问题:前端项目中用到socket.io定时请求数据时导致后台服务挂掉了。
自己平时项目中也没用到过socket.io网络组件去处理数据请求。心想说不定可能是其他问题导致,还是先去看看再说。早上一到项目组我就赶紧看了下问题。他们里面的业务场景是这样:用长连接定时2s去后台拿数据,如果服务端没响应就定时10s再去请求数据。本来想着是不是代码里频繁建立连接导致的后台服务挂掉了呢,通过用socket.io的监听方法并没发现程序中重新去建立连接的通知。但是后台的工程师通过日志说明前端确实是一直在发get,post,并不是建立一个socket通道执行请求响应的。
通过查阅资料发现对于WebSocket来说它必须依赖HTTP协议进行一次握手握手成功后,数据就直接从TCP 通道传输,与HTTP无关了,在进行http握手以后它会根据配置参数可以自动升级成websocket进行双向通信。
项目中所表现出来的问题就是进行请求是并没有升级成websocket通信方式,还是进行以http的方式进行polling,通过配置socket.io中的日志参数打印日志也证实了这一点。那么为什么会升级失败呢,原因就是再进行第一步http握手时失败了,项目中用是https的方式进行请求的,但是因为用的是自签名的证书导致握手失败,这才导致socket.io以老的polling方式进行请求的。那么定位到问题所在,通过更改socket.io组件参数允许自签名证书进行请求就解决了这个问题。