【问题标题】:How to create multiple Nodejs socket io server-client?如何创建多个 Nodejs 套接字 io 服务器-客户端?
【发布时间】:2017-04-25 20:07:55
【问题描述】:

我是 Nodejs 和 Socket.io 的新手,这是我第一次创建任何聊天应用程序,如果我问了一些愚蠢的问题,请原谅我。

在我的网络中,我必须提供一种聊天服务,一种是实时辩论,它是一种聊天室,另一种是像 Facebook Messenger 这样的私人消息传递。

我已经在私人信使中创建了两者,然后再显示我正在检查对话 ID 的消息,它的工作非常正常。现场辩论也正常运作。

但是有一个问题,在私人信使中发送的任何消息也会显示在现场辩论窗口中。所以我修改了messenger的Server.js文件,也修改了监听端口,现在live辩论的监听端口是3000,messenger的监听端口是8050,但是Live辩论仍然接收messenger消息。

我这样做的方式是否错误?有没有其他方法可以运行两个聊天应用程序?

我正在使用这个服务器代码

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');

server.listen(3000);
io.on('connection', function (socket) {

  console.log("client connected");
  var redisClient = redis.createClient();
  redisClient.subscribe('message');

  redisClient.on("message", function(channel, data) {
    console.log("mew message add in queue "+ data+ " channel");
    socket.emit(channel, data);
  });

  socket.on('disconnect', function() {
    redisClient.quit();
  });

});

使用命名空间 server.js

var nsp = io.of('/debate')
nsp.on('connection', function (socket) {

  console.log("client connected"+socket.id);
  var redisClient = redis.createClient();
  redisClient.subscribe('message');
  var redisClient1 = redis.createClient();
  redisClient1.subscribe('debate');

  redisClient.on("message", function(channel, data) {
    console.log("mew message add in queue "+ data+ " channel");
    nsp.emit(channel, data);

  });   

  socket.on('disconnect', function() {
    redisClient.quit();
  });

});

客户端代码

var socket = io.connect('http://localhost:3000/debate');
socket.on('message', function (data) {
    data = jQuery.parseJSON(data);
    console.log(data.user);
    $( "#messages" ).append( "<strong>"+data.user+":</strong><p>"+data.message+"</p>" );
    $('#messages').animate({
    scrollTop: $('#messages').get(0).scrollHeight}, 200);
});

【问题讨论】:

    标签: node.js redis socket.io chat node-redis


    【解决方案1】:

    socket.io 支持使用不同的命名空间。您应该使用该功能而不是创建两个单独的服务器。之后,您可以将 socket.emit 用于该特定命名空间。有关更多信息,请参阅文档:https://socket.io/docs/rooms-and-namespaces/

    【讨论】:

    • 这就是我想要的,但是使用命名空间时,我的客户端无法连接。我还使用了 socket.to(socket.id).emit(channel, data);这个连接到客户端但不发送数据。我用名称空间代码编辑了问题。请看一看。
    【解决方案2】:

    不是太难,我写了一个聊天应用,我想每个人在启动nodejs时都会这样做,但是nodeJS的房间非常好用。

    io.on('connection', function(client){
    
        client.on('room_connection', function(id){
            client.join(id); // User joins room.
        })
    
       client.on('message', function(data){
           io.to(data.room).emit('message', {message:data.message, client:client.conn.id});
       });
    })
    

    这几乎就是您所需要的。这适用于 PM,因为您根本不允许多个用户加入此聊天室,以及多个用户可以加入的普通聊天室。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2013-07-06
      • 2019-11-19
      • 1970-01-01
      • 2011-08-14
      相关资源
      最近更新 更多