解决socket.io websocket 在两台服务器上报错问题
问题:
前端使用socket.io
创建websocket链接,本地测试没问题,但是把服务上到双机房就出问题,提示创建不了链接。
解决方案:
在socket.io-clent
构建websocket的时候,加一个配置{transports: ['websocket']}
就行,如下
socket = io.connect(requestUrl, {transports: ['websocket']});
原理解析:
socket.io
在启动时,先尝试轮询请求。
然后,在某个时刻,它将尝试启动webSocket连接。webSocket连接是通过发送指定upgrade: websocket
标头的特定类型的http请求来完成的,然后服务器可以适当地响应它是否支持websocket。如果服务器同意升级,则该特定http连接被“升级”为webSocket协议。此时,客户端知道webSocket受支持并且它停止使用轮询http请求。
在尝试轮询时,会先发送两个http请求,来建立一个长链接,如果服务端加了负载均衡,两次请求给发到了不同了服务器上,这个链接就建立不起来,致使失败报错。
在配置项里添加transports: ['websocket']
,设置为只允许使用websocket
方式请求数据,则可以避免此问题。
需要注意,IE9和早期版本不能使用WebSocket,在这些浏览器websocket不能使用。
参考文档:
https://www.jianshu.com/p/a3e06ec1a3a0 https://stackoverflow.com/questions/28238628/socket-io-1-x-use-websockets-only