两个节点服务器可以同时运行并进行交互,以便一个是为客户端服务的中介吗?

时间:2013-02-08 20:27:47

标签: javascript multithreading node.js express socket.io

我以非常基本的方式修改了simple chat tutorial中的一些代码,以便我在NodeJS服务器上安装一个JavaScript聊天机器人,当用户输入内容时,它会立即向客户端发送响应。

这是NodeJS服务器上代码的相关部分,它起作用:

socket.on('sendchat', function (data) {
    // we tell the client to execute 'updatechat' with 2 parameters
    io.sockets.emit('updatechat', socket.username, data);
    // we also tell the client to send the bot's response
    io.sockets.emit('updatechat', 'BOT', bot.transform(data));
});

因此机器人的响应与用户的输入密切相关。我现在想把机器人放在不同的节点服务器上,以便聊天可以像用户一样交付机器人并做出反应,这样机器人就可以独立处理和行动。大致是:

USER(客户端/浏览器)<---> MEDIATOR(节点服务器1)<---> CHAT BOT(节点服务器2)

...

我已经尝试过在我看来显而易见的事情(这显然也是错误的),这是从我的客户那里拿走这条线:

var socket = io.connect('http://localhost:8080'); // 8080 being the port for the other server

我将其放入我的服务器端js文件中,如下所示:

var app = require('express').createServer();
var io = require('socket.io').listen(app);
app.listen(8080);

var socket = io.connect('http://localhost:8080');

但是这会在节点控制台中产生错误,表示io对象没有方法connect。也许这是因为connect只属于客户端JS脚本。有没有一种简单的方法让我的Node服务器与另一个Node服务器交互而不会破坏客户端库?

更基本的是,是否可以同时运行两个节点服务器,并且在推送到客户端之前,有一个是调解器来传递和接收来自另一个节点的消息?我正在使用Express框架(v2.4.6)和socket.io(v0.8.4),但我对其他建议持开放态度。

1 个答案:

答案 0 :(得分:4)

您的代码中存在一些错误。一个人应该使用

io.sockets.on('connection', function (socket) {
socket.on('updatechat', function(data) {
...
sockets.emit('User',{'user': 'login'});
sockets.emit('User',{'data': data});
});
});

使用socket.emit而不是io.sockets.emit。 io.sockets.emit将发送给所有客户端。 此外,您不能从服务器上的客户端删除相同的行!!!,使用以下命令从节点连接到另一个服务器。

var ioc = require('socket.io-client');         //ioc
var socket2 = ioc.connect('server2:8080');   //socket2

休息你可以搞清楚: 客户 - &gt;插座 - &gt;服务器 - &gt; socket2 - &gt; server2

更新:socket.io-client是一个单独的软件包,需要安装才能使其正常工作。见这里:https://npmjs.org/package/socket.io-client

只需为安装npm install socket.io-client

执行此操作