WebSocket握手期间错误:缺少“连接”标头

时间:2018-12-16 00:51:59

标签: node.js sockets express websocket socket.io

我是Node的新手,甚至是Socket.io的新手。我刚刚在spaiglas.com上获得了我的第一个聊天应用程序,尽管开发人员控制台中的一个错误非常简单,但该应用程序仍然可以正常工作...

WebSocket connection to 'ws://example.com/...' failed
: Error during WebSocket handshake
: 'Connection' header is missing

这是我所有代码的codepen。我已经将其上传到我的托管服务提供商,该提供商正在Node 9.11.2环境中的Apache服务器上通过cPanel使用Passenger。

根据我一直在阅读的内容,无法使用AJAX设置“连接”标头,这可能会带来安全隐患,但由服务器来处理吗?可以手动设置此标头吗?

通过查看标头,我已经注意到,通常早在其中一个标头中,总是成功地将协议切换/升级到WebSockets,但是随后平台似乎总是恢复为HTTPS /轮询。在下面我刚才观察到的情况下,实际上在67个实例中有2个实例成功地切换到WebSockets协议并使用了该协议。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:-1)

在启动侦听端口80的HTTP服务器之前,您需要初始化socket.io。在文档中是...

var http = require('http').Server(app);
var io = require('socket.io')(http);

然后,您致电http.listen(3000, ...)。这将启动套接字。

在客户端上,您的路径也不正确。 Websockets是协议(ws://somedomain.com),就像HTTP一样。通过http://连接时,这是一个不同的协议。我要么不传递任何东西,要么使用可以在socket.io文档中找到的命名空间。

Socket.io恢复为长时间轮询,有时甚至不使用websocket(这部分是为什么它通常比npm上的ws等库慢)的原因。因此,将http://传递到客户端的io(...)可能与他们的库没有关系,但是无论如何我都会将其删除并执行我的上述建议。