使用Node,Express,Heroku和Socket.io创建聊天室

时间:2016-04-12 08:15:51

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

所以我已经构建了一段时间的应用程序,而且我在可伸缩性方面遇到了问题。我是Node和Heroku的新手。请耐心等待。

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

我认为解决方案涉及修改每个客户端的连接方式(下面是代码片段)。有没有办法创建基于位置的“房间”,例如,连接的客户是唯一获得这些更新的客户?知道如何解决这个问题吗?如果有人也愿意解释我对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

1 个答案:

答案 0 :(得分:0)

我会尝试这样的事情:

  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

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