所以我已经构建了一段时间的应用程序,而且我在可伸缩性方面遇到了问题。我是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
答案 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
我从未制作聊天应用程序,希望它有所帮助。