解决socket.io websocket 在两台服务器上报错问题

2018-12-21
JavaScript
3688

问题:

前端使用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