Socket.IO 没有 http 服务器?

Socket.IO without http server?

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

在 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服务器,否则他不会将套接字绑定到我想要的ip:

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

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

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

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

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

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

另一方面,

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

您可以使用 'net' 模块创建套接字连接而不传递 http 参数。 大多数像 Socket.io 这样的套接字库都是建立在 'net' 模块之上的。

下面是一个如何在服务器端使用 'net' 模块的例子:

const net = require('net');

const server = net.createServer((socket) => {
  socket.end(`${new Date()}\n`);
});
server.listen(56010);

客户端使用方法如下:

const net = require('net');

const client = new net.Socket();
client.connect({ port: 56010, host: '127.0.0.1' });
client.on('data', (data) => {
  console.log(data.toString('utf-8'));
});