gpt4 book ai didi

node.js - 没有http服务器的Socket.IO?

转载 作者:IT老高 更新时间:2023-10-28 22:08:06 25 4
gpt4 key购买 nike

我目前正在使用来自 nodejs 的 Socket.IO 在服务器和一些客户端之间共享一些实时信息。客户端应该只与服务器通信,而不是相互通信。

在 windows 上一切都很好,我可以共享信息,但是当它把东西放到 linux vps 上时,我遇到了一个问题,他在 ipv6 套接字上启动了所有东西,这让我很难连接到客户端浏览器库来自socket.io

我这样启动服务器:

io = require('socket.io').listen(3000);

效果很好,我可以连接。现在在 linux vps 上,我尝试使用这样的 ipv4 地址来阻止 ipv6

io = require('socket.io').listen(3000, '0.0.0.0');

但这不起作用,不是在 linux 上,也不是在 Windows 上。除非我像这样使用http服务器,否则他不会将套接字绑定(bind)到我想要的ip:

http = require('http').createServer().listen(3000, '0.0.0.0');
io = require('socket.io').listen(http);

现在我的问题是,我必须使用 http 服务器来解决将套接字绑定(bind)到正确的本地 ip 和端口的问题还是有其他解决方案?在我的第一行代码的情况下,socketio 是在后台启动一个 http 服务器,因为它是一个 web 套接字,还是 socketio 在没有 http 服务器的情况下工作?

最佳答案

Socket.io 和一般的 WebSockets 需要一个 http 服务器来进行初始升级握手。因此,即使您不为 Socket.io 提供 http 服务器,它也会为您创建一个。

问题在于 io.listen(3000, '0.0.0.0') 中的第二个参数被 Socket.io 忽略。如果你需要控制监听哪个网络接口(interface),你应该使用上一个片段中的代码,因为它本质上是 Socket.io 在幕后所做的。

var http = require('http').createServer().listen(3000, '0.0.0.0');
var io = require('socket.io').listen(http);

WebSocket 连接由客户端发起 Protocol Upgrade通过常规 HTTP 协议(protocol)发出请求,这就是需要 HTTP 服务器的原因。

另一方面,Socket.io 与其他 WebSocket 服务器有点不同。它使用 Engine.IO在幕后,这是一个以可靠为目标的实现。它默认通过 XHR/JSONP 轮询(定期发生的常规 HTTP 请求-响应)模拟 WebSocket 连接,但如果可能的话,将连接升级为 WebSocket 连接。原因是他们的研究发现,各种防火墙、代理和杀毒软件实际上确实会阻止 WebSocket 连接,而他们的 Engine.IO 实现向您隐藏了这一事实,而无需在 WebSocket 连接的情况下实现回退解决方案被屏蔽了。

关于node.js - 没有http服务器的Socket.IO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33188147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com