如何使用 websockets 连接两个 node.js 服务器?

Posted

技术标签:

【中文标题】如何使用 websockets 连接两个 node.js 服务器?【英文标题】:How to connect two node.js servers with websockets? 【发布时间】:2012-02-08 20:51:51 【问题描述】:

这是我的问题:

我有服务器 A,运行 node.js 并使用 socket.io 与客户端(网络浏览器)通信。这一切都运行良好,花花公子。

但是,现在我有服务器 B,它也需要通过 websockets 连接到服务器 A,所以我碰壁了。我发现的所有 node.js websocket 客户端都不能与服务器 A 上的 socket.io 一起使用。

所以,这就是我努力的目标:

.--------.      .----------.      .----------.
| CLIENT | <--> | SERVER A | <--> | SERVER B |
'--------'      '----------'      '----------'

Client-server 通过socket.io完成连接

现在,服务器 B(运行 node.js)应该通过 websocket 连接到服务器 A(为了通过端口 80)。但是……

即使是 socket.io-client 模块中的示例代码也不起作用...:/

// Connect to server
var socket = new io.Socket('localhost', port: 8080);
socket.connect();

// Add a connect listener
socket.on('connect', function(socket)  
    console.log('Connected.');
);

代码顺利通过,几秒钟后执行结束。

更新:代码示例

服务器(运行良好)如下所示:

// Load requirements
var http = require('http'),
    io = require('socket.io');

// Create server & socket
var server = http.createServer(function(req, res)

    // Send html headers and message
    res.writeHead(404, 'Content-Type': 'text/html');
    res.end('<h1>Aw, snap! 404</h1>');
);
server.listen(8080);
io = io.listen(server);

// Add a connect listener
io.sockets.on('connection', function(socket)  

    console.log('Client connected.');

    // Disconnect listener
    socket.on('disconnect', function() 
        console.log('Client disconnected.');
    );
);

客户端是这样的

console.log('1');

// Connect to server
var io = require('socket.io-client')
var socket = new io.Socket('localhost', port: 8080);
socket.connect();

console.log('2');

// Add a connect listener
socket.on('connect', function(socket)  
    console.log('Connected!');
);

console.log('3');

1、2 和 3 打印得很好,没有错误,几秒钟后进程就退出了

此外,服务器 A 不会向日志输出任何内容,即使我将 socket.io 日志记录设置为“一切”。

【问题讨论】:

你肯定是 websockets 客户端,还是可以只使用普通的旧套接字? the node.js websocket clients I've found 哪些? 我至少需要模拟 websockets,因为我需要连接到同一个服务器。 我试过socket.io-client、ws、websocket-node socket.io-client 为我和其他人工作;我认为您应该发布一个 [非] 工作示例来说明您的问题。另外,尝试添加 process.on('UncaughtException') 或一些日志记录; “没有任何错误”意味着“看起来不够努力”:) 【参考方案1】:

事实证明,出于某种原因,我使用的是旧示例,尽管我对它们进行了三次检查。嗯,呵呵。

此外,最新的 Node (6.x.x) 上的 socket.io-client 已损坏。设法从 github 找到更新,替换了文件,是的,一切正常!

编辑:不幸的是,我没有保存任何指向工作示例的链接,但在快速浏览代码后,似乎唯一的更改是客户端代码,现在看起来像这样:

console.log('1');

// Connect to server
var io = require('socket.io-client')
var socket = io.connect('localhost:8080', reconnect: true);

console.log('2');

// Add a connect listener
socket.on('connect', function(socket)  
    console.log('Connected!');
);

console.log('3');

【讨论】:

你能发布新的例子或指出它们吗?我面临的问题与您所面临的完全相同。 不幸的是,我没有保存任何链接,但我浏览了工作代码,并将我发现的差异更新为上面的答案。 我的代码也能正常工作。就我而言,我没有指定端口。添加端口后代码开始工作。【参考方案2】:

对于未来的人: 这是 2 个非常简单的 Node.js 应用程序,它们使用 socket.io 相互连接、发送和接收消息。

需要的包是:

npm install socket.io

Node-App-1 server.js:

var io = require('socket.io').listen(3000);
io.on('connection', function (socket) 
    console.log('connected:', socket.client.id);
    socket.on('serverEvent', function (data) 
        console.log('new message from client:', data);
    );
    setInterval(function () 
        socket.emit('clientEvent', Math.random());
        console.log('message sent to the clients');
    , 3000);
);

Node-App-2 client.js:

var io = require('socket.io-client');
var socket = io.connect("http://localhost:3000/", 
    reconnection: true
);

socket.on('connect', function () 
    console.log('connected to localhost:3000');
    socket.on('clientEvent', function (data) 
        console.log('message from the server:', data);
        socket.emit('serverEvent', "thanks server! for sending '" + data + "'");
    );
);

【讨论】:

【参考方案3】:

这是我编写的一个 sn-p 代码,它使用的是 socket.io 1.0.6 和 socket.io-client 1.0.6。案例如下:

服务器 A(Socket.io 客户端) 服务器 B(Socket.io 服务器)

服务器 B(服务器):

// Load requirements
var http = require('http'),
io = require('socket.io');

// Create server & socket
var server = http.createServer(function(req, res)

  // Send HTML headers and message
  res.writeHead(404, 'Content-Type': 'text/html');
  res.end('<h1>Aw, snap! 404</h1>');
);
server.listen(8080);
io = io.listen(server);

// Add a connect listener
io.sockets.on('connection', function(socket)

  console.log('Client connected.');

  // Disconnect listener
  socket.on('disconnect', function() 
  console.log('Client disconnected.');
  );
);

服务器 A(客户端):

console.log('1');
// Connect to server
var io = require('socket.io-client');
var socket = io.connect('http://localhost:8080', reconnect: true);

console.log('2');

// Add a connect listener
socket.on('connect', function(socket)  
  console.log('Connected!');
);

console.log('3');

如果我只在客户端服务器上使用 localhost:8080,它不会连接。

【讨论】:

以上是关于如何使用 websockets 连接两个 node.js 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到 node.js websocket 消息的连接?

验证 WebSocket 连接

在 node.js 服务器上使用 nginx 时出现“websocket 连接无效”

Linux Bash:如何作为客户端打开 websocket 连接

Node Js、websockets 保存通道中的连接

与 Hasura 的 WebSocket 连接不适用于 Node.js 上的 ApolloClient v3