Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 创建聊天室“;房间“;使用Node、Express、Heroku和Socket.io_Ios_Node.js_Express_Heroku_Socket.io - Fatal编程技术网

Ios 创建聊天室“;房间“;使用Node、Express、Heroku和Socket.io

Ios 创建聊天室“;房间“;使用Node、Express、Heroku和Socket.io,ios,node.js,express,heroku,socket.io,Ios,Node.js,Express,Heroku,Socket.io,因此,我已经开发了一段时间的应用程序,在可伸缩性方面遇到了问题。我对诺德和赫罗库都是新手。请容忍我 我最初是为了让我的节点服务启动并运行。本质上,它创建了一个实时聊天服务。然而,我现在的问题是如何创建“房间”。对我来说,可能有15+次聊天是没有意义的,但它们都在同一个clientSocket上调用相同的函数,我必须确定哪些UI更新会发送到前端的哪些客户端。到目前为止,我有15个以上的客户端都试图在不同的聊天中进行交互,但我会立即向每个人推送更新(例如,当发布消息时),然后根据我在每个设备上缓存的

因此,我已经开发了一段时间的应用程序,在可伸缩性方面遇到了问题。我对诺德和赫罗库都是新手。请容忍我

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

我认为解决方案涉及修改每个客户机的连接方式(下面是代码片段)。是否有方法创建基于位置的“房间”,例如,连接的客户端是唯一获得这些更新的客户端?你知道怎么解决这个问题吗?如果有人愿意解释我对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
var-app=require('express')();
var http=require('http')。服务器(应用程序);
var io=require('socket.io')(http);
var pg=需要(“pg”);
var userList=[];
var typingguers={};
var ActiveQueue=[];
app.get('/',函数(req,res){
res.send(“活动RT队列”);
});
var conString=”postgres://url";
pg.defaults.ssl=true;
var客户=新的pg客户(施工);
client.connect(函数(err){
如果(错误){
返回控制台。错误('无法连接到postgres',错误);
}
});
http.listen(process.env.PORT | | 5000,函数(){
console.log('监听*:5000');
});
io.on('connection',函数(clientSocket){
log(“已连接的用户”);
clientSocket.on('disconnect',function()){
console.log('user disconnected');
var客户昵称;

对于(var i=0;i我会尝试以下方法:

  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
    }
,


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

听起来它们可能正是您想要的。@JoeClay谢谢。假设我为每个房间创建了一个不同的名称空间。我是否必须复制我已经编写的函数,以便它们符合这些不同的名称空间?或者创建一组这样的房间更有意义每个人都能处理大量的流量吗?我想我不明白连接是如何处理的
  socket.emit("room:general", json_object);
  socket.on("room:general:newMessage", onYourDefinedEmiterListener);
  ..........
  ..........
  //and so for each room