【问题标题】:Creating chat "rooms" using Node, Express, Heroku, and Socket.io使用 Node、Express、Heroku 和 Socket.io 创建聊天“房间”
【发布时间】:2016-08-02 17:13:30
【问题描述】:

所以我已经构建应用程序有一段时间了,但我在可扩展性方面遇到了问题。我是 Node 和 Heroku 的新手。请多多包涵。

我最初关注this tutorial 来启动并运行我的节点服务。从本质上讲,它创建了一个实时聊天服务。但是,我现在的问题是创建“房间”。对我来说,我可能正在进行 15 次以上的聊天,但他们都在同一个 clientSocket 上调用相同的函数,我必须确定哪些 UI 更新会发送到前端的哪些客户端。到目前为止,我有超过 15 个客户都试图在不同的聊天中进行交互,但我会同时向每个人推送更新(例如,当发布消息时),然后根据哪个房间 ID 确定要更新谁的 UI我在每台设备上缓存。对我来说,这似乎是对计算能力的严重浪费。

我认为解决方案涉及修改每个客户端的连接方式(即下面的代码 sn-p)。有没有办法创建基于位置的“房间”,例如,连接的客户端是唯一获得这些更新的客户端?知道如何解决这个问题吗?如果有人也愿意解释一下我对 Node、Express、Heroku、Socket.io 或其他人的不理解,请告诉我。

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

var userList = [];
var typingUsers = {};
var ActiveQueue = [];

app.get('/', function(req, res){
  res.send('<h1>Active RT Queue</h1>');
});


var conString = "postgres://url";
pg.defaults.ssl = true;
var client = new pg.Client(conString);
client.connect(function(err) {
  if(err) {
    return console.error('could not connect to postgres', err);
  }
});

http.listen(process.env.PORT || 5000, function(){
  console.log('Listening on *:5000');

});


io.on('connection', function(clientSocket){
  console.log('a user connected');

  clientSocket.on('disconnect', function(){
    console.log('user disconnected');

    var clientNickname;
    for (var i=0; i<userList.length; i++) {
      if (userList[i]["id"] == clientSocket.id) {
        userList[i]["isConnected"] = false;
        clientNickname = userList[i]["nickname"];
        break;
      }
    }

    delete typingUsers[clientNickname];
    io.emit("userList", userList);
    //io.emit("userExitUpdate", clientNickname);
    //io.emit("userTypingUpdate", typingUsers);
  });


  clientSocket.on("exitUser", function(clientNickname){
    for (var i=0; i<userList.length; i++) {
      if (userList[i]["id"] == clientSocket.id) {
        userList.splice(i, 1);
        break;
      }
    }
    io.emit("userExitUpdate", clientNickname);
  });


  clientSocket.on("connectUser", function(clientNickname) {
      var message = "User " + clientNickname + " was connected.";
      console.log(message);

      var userInfo = {};
      var foundUser = false;
      for (var i=0; i<userList.length; i++) {
        if (userList[i]["nickname"] == clientNickname) {
          userList[i]["isConnected"] = true
          userList[i]["id"] = clientSocket.id;
          userInfo = userList[i];
          foundUser = true;
          break;
        }
      }

      if (!foundUser) {
        userInfo["id"] = clientSocket.id;
        userInfo["nickname"] = clientNickname;
        userInfo["isConnected"] = true
        userList.push(userInfo);
      }

      io.emit("userList", userList);
      io.emit("userConnectUpdate", userInfo)
  });

///functions pertaining to transfer of messages and updating the UI follow

【问题讨论】:

  • Rooms and Namespaces 听起来可能就是您要找的东西。
  • @JoeClay 谢谢。假设我为每个房间创建了一个不同的命名空间。我是否必须复制我已经编写的函数以便它们符合这些不同的命名空间?或者创建一堆可以处理大量流量的房间是否更有意义?我想我不明白如何处理连接

标签: ios node.js express heroku socket.io


【解决方案1】:

我会尝试这样的:

  io.on('connection', function(clientSocket) {

      clientSocket.on('room:general', function(data) {
           var user = data.user;
           var message = data.message;
           console.log('%s sent new message: %s',user,message);

           io.emit('room:general:newMessage', data);
      });
  //and so for each room
  .........
  });

你需要从前端发送 JSONObject:

    {
     user:your_username,
     message:user_message
    }

,

  socket.emit("room:general", json_object);
  socket.on("room:general:newMessage", onYourDefinedEmiterListener);
  ..........
  ..........
  //and so for each room

我从未制作过聊天应用程序,希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 2017-09-27
    • 2020-01-10
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多