【问题标题】:Socket.IO without http server?没有http服务器的Socket.IO?
【发布时间】: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 服务器的情况下工作?

【问题讨论】:

    标签: node.js socket.io


    【解决方案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'));
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      相关资源
      最近更新 更多