我正在尝试构建一个包含两个组件的应用程序。有一个面向公众的组件和一个管理组件。每个组件将托管在不同的服务器上,但这两个组件将访问同一个数据库。我需要设置管理组件,以便能够向面向公众的组件发送消息以查询数据库并将信息发送给所有公共客户端。
我无法弄清楚如何在两个组件之间建立连接。我正在使用Socket.io提供的标准HTTP服务器设置。
var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
app.listen(80);
function handler (req, res) {
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
我看过this question,但无法真正按照提供的答案,我认为情况有所不同。我只需要其中一台服务器能够向其他服务器发送消息,和仍然向/从其自己的客户端发送/接收消息。
我是Node的新手(因此也就是Socket),所以一些解释会非常有帮助。
答案 0 :(得分:5)
我能找到的最简单的事情就是使用socket.io-client在服务器之间创建客户端连接。在我的情况下,管理服务器连接到客户端服务器:
var client = require("socket.io-client");
var socket = client.connect("other_server_hostname");
管理员端的操作然后可以向管理服务器发送消息,管理服务器可以使用此客户端连接将信息转发到客户端服务器。
在客户端服务器上,我创建了一个on“adminMessage”函数,并检查一些其他信息以验证消息的来源,如下所示:
io.sockets.on('connection', function (socket) {
socket.on('adminMessage', function (data) {
if(data.someIdentifyingData == "data") {
// DO STUFF
}
});
});
答案 1 :(得分:-2)
我遇到了同样的问题,但是我决定使用socket.io-client来使用redis pub / sub(至少对我来说是更简单的方法),结果非常简单。我对socket.io-client
的主要问题是,您需要了解周围的服务器主机并连接到每台服务器以发送消息。
您可以在这里查看我的解决方案:https://github.com/alissonperez/scalable-socket-io-server
使用此解决方案,您可以拥有所需的进程/服务器数量(使用自动扩展解决方案),只需将redis用作在服务器之间转发消息的方式。