Socket.io连接失败:WebSocket在建立连接之前关闭

15

问题

我的Twitter流应用使用Socket.io,在通过IP地址和端口号访问站点时工作正常,但在使用域名访问站点时,实时流会抛出错误。

请尝试下面的链接,并打开开发者工具查看错误:

使用域名访问站点 (http://sentiment-sweep.com)

数百个套接字错误遵循此格式:

WebSocket connection to 
'ws://sentiment-sweep.com/socket.io/?EIO=3&transport=websocket&sid=guBmeCqsOr22CTsWAAC0' 
failed: WebSocket is closed before the connection is established.

使用IP和端口访问站点 (http://XXX.XX.XXX.XX:3003)

一开始出现了一些套接字错误,但是在10-15秒后应用程序开始正常工作。

背景

我几年前为大学项目制作了这个Node应用程序。我一直在更新它。它使用Socket.io和Twitter API来流式传输实时推文,计算情感,并使用D3可视化显示结果。我使用NGINX进行端口转发。

供参考,这是我的git仓库:https://github.com/Lissy93/twitter-sentiment-visualisation

最近我进行了一些小的HTML/CSS更改,并更新了一些依赖项,这就是这个奇怪的socket.io问题开始的时候。

我到目前为止尝试过的

  • 更改端口 - 没有区别
  • 我使用io.connect();没有参数连接
  • 包括本地的socket.io,而不是从CDN读取
  • 可能与我的网站非SSL有关
  • 本地它完全正常,比API版本更快,延迟更小

有人见过类似的问题吗?

1个回答

12

找到了解决方案,其实非常简单!在此发布答案,以帮助其他遇到类似问题的人,因为我被这个问题卡了2天!

我的问题是由于依赖项更新引起的。

Socket.io V 2.0.0 不向后兼容。

根据发布说明:

这个新版(V 2.0.0)带来了几个性能改进,但在发布说明底部悄悄加入的是这个消息:

由于以下原因,此版本不向后兼容:

  • 与引擎.io解析器的utf-8编码相关的破坏性更改(socketio/engine.io-parser#81)
  • 更新使客户端上的套接字ID匹配服务器端上的ID(socketio/socket.io-client#1058)

请注意,如果您使用自签名证书,则rejectUnauthorized现在默认为true (socketio/engine.io-client#558)。

这是完整的V2发行说明:https://github.com/socketio/socket.io/releases/tag/2.0.0

解决方案是使用 HTTPS

将您的应用程序转换为 HTTPS,或按照文档要求签署自己的请求。不过,作为快速修复,我只需要降级回socket.io V 1.7.0即可正常工作。


1
我有 HTTPS,并想映射到主机(域名 https://exampledomain.com:3000),变量 io = require('socket.io')(3000); 我怎样可以在其中添加主机并映射到该域名?你是如何解决这个问题的? 感谢您的帮助! - Manjunath Bilwar
1
@ManjunathBilwar - 你可以创建一个HTTP服务器来监听特定的域名和端口,然后将其传递给你的函数。这将起作用:const domain = "localhost"; const port = 8080; const io = require('socket.io'); const server = http.createServer(); server.listen(port, domain); const socket = io.listen(server);(注释中的代码片段显示效果不太好),但希望这能帮到你 :) - Lissy93

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接