没有http服务器的Socket.IO?

Posted

技术标签:

【中文标题】没有http服务器的Socket.IO?【英文标题】:Socket.IO without http server? 【发布时间】:2016-01-16 05:59:18 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

问题是 Socket.io 忽略了 io.listen(3000, '0.0.0.0') 中的第二个参数。如果你需要控制监听哪个网络接口,你应该使用上一个 sn-p 中的代码,因为它本质上是 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 连接的情况下实现回退解决方案被屏蔽了。

【讨论】:

非常感谢,这对我有很大帮助 + 1【参考方案2】:

您可以使用“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'));
);

【讨论】:

以上是关于没有http服务器的Socket.IO?的主要内容,如果未能解决你的问题,请参考以下文章

让 socket.io、express 和 node-http2 通过 HTTP/2 进行通信

node.js 上的 Socket.io-client 只工作一次

chrome 扩展背景 - socket.io 连接到 https 而不是 http

GET http://js:port/socket.io/1/ 404 未找到

Android Node.js Socket.io没有连接

http请求后的Socket.IO帧头无效