我目前正在处理来自nodejs的Socket.IO,以便在服务器和某些客户端之间共享一些实时信息。客户端应该只与服务器通信,而不是相互通信。
在Windows上一切都很好,我可以分享信息,但是当它把东西放到linux vps上时,我遇到的问题是他在ipv6 socket上启动了所有内容,这使得我很难连接到客户端浏览器库来自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套接字,或者在没有http服务器的情况下进行socketio工作吗?
非常感谢:)
答案 0 :(得分:29)
Socket.io和WebSockets一般需要http服务器进行初始升级握手。因此,即使您没有为Socket.io提供http服务器,它也会为您创建一个。
问题是Socket.io会忽略io.listen(3000, '0.0.0.0')
中的第二个参数。如果您需要控制要侦听的网络接口,您应该使用最后一个代码段中的代码,因为它实际上是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轮询模拟WebSocket连接(定期发生常规HTTP请求 - 响应),但如果可能,则将连接升级到WebSocket连接。原因是因为他们的研究发现各种防火墙,代理和防病毒软件实际上阻止了WebSocket连接,而他们的Engine.IO实现隐藏了这一事实,而无需在WebSocket连接的情况下实现回退解决方案被阻止了。
答案 1 :(得分:0)
您可以使用'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'));
});