我有一些问题,我应该如何构造我的应用程序。
可以和50+用户在一个房间里,也可以私下给用户发短信。
我应该在客户端有两个不同的发射器吗?或者我应该只有一个,让服务器根据数据决定它应该是一个私有消息还是公共消息(我想的是一个参数,它是正确的还是错误的)?
发布于 2016-12-11 08:42:14
这实际上只是一个软件设计的选择。没有“对”或“错”的答案。这与决定是为两个相关功能单独命名还是为传递不同参数的函数创建一个函数几乎是同一个问题。
我个人的看法是,如果您为这样的私有消息使用单独的消息名,您的代码会更简单:
// send to a single user
socket.emit("privateMessage", {userID: xxxx, msg: "Hello"});
// broadcast to all users in my room
socket.emit("publicMessage", {msg: "Hello"});然后,在服务器上,您将有一个单独的处理程序来处理公共消息和私有消息,这可能是一件好事。
而不是使用带有参数的公共消息:
// send to a single user
socket.emit("message", {type: "private", userID: xxxx, msg: "Hello"});
// broadcast to all users in my room
socket.emit("message", {type: "public", msg: "Hello"});发布于 2018-04-18 23:42:50
为了进一步澄清jfriend00s的答案,您需要将私有消息定向到特定的socket.id。
在服务器端向特定用户发送:
socket.to(<socketid>).emit('message', {type:"private", msg:"Content"});在服务器端发送到特定房间:
socket.to('FunRoom').emit('message', {type:"public", msg:"Content"});使用:
socket.emit("message", {type: "private", userID: xxxx, msg: "Hello"});建议将发送到整个房间,但只使用客户端代码向特定用户显示。私有消息可以从开发人员工具中读取。
一个简单的方法是使用redis:在套接字连接上将socket.id保存到用户名。
redis.set('userID', socket.id);然后,当消息出现时:
socket.on('message', function (message,callback) {
if(message.type == 'private'){
redis.get(message.userID, function(err, socketID) {
if(err){
return callback(err);//error callback, user may no long be online
}
socket.to(socketID).emit('message', message);
return callback('success')
});
}
socket.to('FunRoom').emit('message', message);
return callback('success')
}如果您采用这种方法,请确保清除断开连接时的红线:
socket.on('disconnect', function () {
redis.del(userID)
socket.to('FunRoom').emit('userLeft', {userID: userID});
});尽管为时已晚,但我只想添加这一点,因为jfriend00建议的方法似乎建议将私有消息过滤到客户端。
https://stackoverflow.com/questions/41082000
复制相似问题