【问题标题】:Socket.io trigger events between two node.js apps?两个node.js应用程序之间的Socket.io触发事件?
【发布时间】:2015-03-13 06:00:32
【问题描述】:

我有两台服务器,一台用于后端应用程序,一台用于前端。它们是抽象的,但共享同一个数据库,我需要两者使用 socket.io 在彼此之间进行实时事件通信。

前端

// serves a front end website
var appPort  = 9200; 

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

io.sockets.on('connection', function(socket) {

    socket.on('createRoom', function(room) {
        socket.join(room); // use this to create a room for each socket (room) is from client side
    });

    socket.on('messageFromClient', function(data) {
        console.log(data)
        socket.broadcast.to(data.chatRoom).emit('messageFromServer', data);
    });


});

后端

//Serves a back end app
var appPort  = 3100; 

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

io.sockets.on('connection', function(socket) {

    socket.on('createRoom', function(room) {
        socket.join(room); // use this to create a room for each socket (room) is from client side
    });

    socket.on('messageFromClient', function(data) {
        console.log(data)
        socket.broadcast.to(data.chatRoom).emit('messageFromServer', data);
    });


});

作为管理员,我想登录到我的后端,在那里我可以看到所有登录的人,在那里我可以点击我想与之聊天的人。

假设他们登录到前端网站,当管理员提交消息客户端时,他们会触发socket.emit('messageFromClient', Message); 我如何使用端口9200 在前端触发messageFromClient 从后端端口提交@ 987654328@?

【问题讨论】:

  • 两个socket.io实例之间使用redis通信怎么样? Redis-socket.io
  • 有人建议,我想做,但在我追求这个想法之前,我想了解为什么它会是有益的。您能否发布一个答案来演示 redis 服务器将扮演什么角色。我很困惑应该在哪里托管和部署 redis 服务器。我会阅读您提供的链接并尽可能仔细地研究它。
  • 我之前遇到过那个 npm 模块,但同样的事情是我需要设置第三个节点服务器,还是将它安装在我现有的服务器之一上?我需要更好地了解它所扮演的角色。我相信这是最好的解决方案。
  • Redis 主要用于将消息(事件)同步到多个服务器,因此如果您有多个 nodejs 服务器,您可以使用 redis-socketio 模块连接它,并且一旦在任何一个接收到消息server ,redis 会将此消息发送到所有其他连接的服务器。 Redis 可以安装在运行应用程序的同一台服务器上。 More about redis usage and deployment
  • 感谢您的解释,我一直在阅读它。我只是对使用它持怀疑态度,因为我不想设置第三台服务器。

标签: javascript node.js sockets socket.io


【解决方案1】:

对于这个用例,你真的不需要在前端启动 socket.io 服务器。

你可以让它工作的方式是:

  1. 保持后端不变,充当 Socket.IO 服务器
  2. 在字体端使用 Socket.IO 客户端连接到服务器。

您可以通过调用安装客户端

npm install socket.io-client

然后使用 :

连接到服务器
var io = require('socket.io-client'),
socket = io.connect('localhost', {
    port: 3100
});
socket.on('connect', function () { console.log("socket connected"); });
socket.emit('messageFromClient', { user: 'someuser1', msg: 'i am online' });

然后,您可以使用相应的用户名创建套接字对象的映射,并根据您的业务逻辑向该用户发送消息。

更多信息:

您可能需要添加客户端断开连接等案例。您可以在此处阅读有关回调的更多信息:

https://github.com/Automattic/socket.io-client

【讨论】:

  • 啊,好人就在紧要关头。实际上我确实尝试过这种方式(从前端删除 socket.io),我在前端包含了用于后端的 socket.io 脚本,但它仍然无法正常工作。我忘了npm install socket.io-client 我会用这个,它应该很好。
  • 我很难配置这个大声笑,但我只是想socket.io服务器:3100将如何与:9200前端通信?
  • 我通过使用var socket = io.connect('http://localhost:3100'); 而不是文档说要使用的var socket = io('http://localhost:3100'); 解决了这个问题,这到底是什么让我疯狂追逐,但它适用于connect,我虽然前一段时间贬值了?
猜你喜欢
  • 2023-03-26
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多