socket 版本的坑

https://wenda.workerman.net/question/2966

http://www.rfcreader.com/#rfc6455_line2178

http://www.zhuyuntao.cn/%e5%9f%ba%e4%ba%8enode%e5%ae%9e%e7%8e%b0websocket%e9%80%9a%e4%bf%a1/

场景复现条件:

后端server socket.io  version 2.2.0

前端原生 WebSocket api发送链接请求。报错

index.html:23 WebSocket connection to 'ws://127.0.0.1:3000/' failed: Connection closed before receiving a handshake response。

恢复可用的条件一:

前端改用同版本  https://cdn.bootcss.com/socket.io/2.2.0/socket.io.js  

var socket = io('http://localhost:3000');
 socket.on('connect', function(){console.log('io-connect ');});
 socket.on('event', function(data){console.log('io-event start');});
 socket.on('disconnect', function(){console.log('io-event disconect');});

正常访问。

恢复可用的条件二:

前端保持不变,后端改用ws插件,不再使用socket.io插件。

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });
wss.on('connection', function(ws) {
      console.log('connected');
      ws.on('message', function(message) {
             console.log('received: %s', message);
      });
      ws.send('something');
});
wss.on('disconnection', function(ws) {
     console.log('disconnected');
})

正常访问。

但是报错的原因是什么呢? 找原因开始。。。。

看报错是 WebSocket 类发出的提示,意思是 失败:连接在接收握手响应之前关闭

是前后端握手过程失败,为啥会握手失败呢?

服务端解包失败,到时握手失败,服务端应该会有提示,Error  decoding a packet.

查看文档发现 socket 和 websocket 是两种socket链接,用了不同的算法。

如果用websocket 访问 socket 服务如果对方不支持 WebSocket解析,将无法支持握手链接。

就算是这样的原因,那socket.io 客户端也用的时候是可以通信的,socket.io 转换了WebSocket的请求吗?

继续查看源码实现,搜索全部error过滤出那个错误,go on

引入了socket.io-parser 

好深。

没看出为啥,请大神路过给个重点。未完待续

-------------------------------------------- 2019/9/3

原文地址:https://www.cnblogs.com/the-last/p/11454920.html