Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 没有http服务器的Socket.IO?_Node.js_Socket.io - Fatal编程技术网

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

Node.js 没有http服务器的Socket.IO?,node.js,socket.io,Node.js,Socket.io,我目前正在使用Socket.IO fro nodejs在服务器和一些客户端之间共享一些实时信息。客户端应该只与服务器通信,而不是相互通信 在windows上一切正常,我可以共享信息,但由于它将内容放到linux vps上,我遇到了一个问题,他在ipv6套接字上启动了所有内容,这使得我很难从socket.io连接客户端浏览器库 我按如下方式启动服务器: io = require('socket.io').listen(3000); http = require('http').createSer

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

在windows上一切正常,我可以共享信息,但由于它将内容放到linux vps上,我遇到了一个问题,他在ipv6套接字上启动了所有内容,这使得我很难从socket.io连接客户端浏览器库

我按如下方式启动服务器:

io = require('socket.io').listen(3000);
http = require('http').createServer().listen(3000, '0.0.0.0');
io = require('socket.io').listen(http);
这很好,我可以连接。现在在LinuxVPS上,我试图通过使用像这样的ipv4地址来阻止ipv6

io = require('socket.io').listen(3000, '0.0.0.0');
但这在linux和Windows上都不起作用。他不会将套接字绑定到我想要的ip,除非我像这样使用http服务器:

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

现在我的问题是,我必须使用http服务器来解决将套接字绑定到正确的本地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协议执行请求的客户端启动,这就是需要HTTP服务器的原因


另一方面,Socket.io与其他WebSocket服务器略有不同。它使用UndertheHood,这是一种以可靠为目标的实现。它默认通过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'));
});

非常感谢,这对我很有帮助