nswbmw / N-chat

使用 Express + Socket.IO 搭建的多人聊天室
1.16k stars 332 forks source link

socket.io 向指定用户发送消息 #7

Open echozheng opened 8 years ago

echozheng commented 8 years ago

原作者的socket.io 的版本较低,在目前较新的版本中,是报错的。 1.0 以后的版本是:io.sockets.connected[socketid].emit(); 所以,要预先保存一个user 到 socketid的映射。

LZJwrtj commented 7 years ago

能说的具体一点吗?搞了好久了还是没搞好,我的版本是1.7.3

echozheng commented 7 years ago

就是要预先定义一个map,key为user,value为user对应的socketid。 在发送的时候,你才能根据user 从map中找出相应的socketid,进行发送消息。

LZJwrtj commented 7 years ago

map{user: socketid}是这样吗? 然后io.sockets.connected[map[user]].emit('say',data)这样对吗;

LZJwrtj commented 7 years ago

哎,还是搞不定啊0.0

echozheng commented 7 years ago

不好意思,这些天都没看邮箱。 对,是这样。我把关键代码贴出来,你自己再琢磨。

//存储用户以及它对应的socketid var userAndSocketidMap = {};

//socket.io 绑定客户端连接。 io.sockets.on("connection", function(socket) { socket.on("online", function(data) { //将上线的用户名存储为 socket对象的属性, //以区分每个socket对象,方便后面使用 socket.name = data.user; //users对象中不包含 该用户名 则插入该用户名 if(!users[data.user]) { users[data.user] = data.user; var socketid = socket.id; //关键步骤 userAndSocketidMap[data.user] = socketid; } //向所有用户广播该用户上线信息 io.sockets.emit("online", {users : users, user: data.user}); });

//服务器端处理客户端发送的 “say”事件 socket.on("say",function(data) { //向所有用户发送消息 if(data.to == "all") { socket.broadcast.emit("say",data); } else { //向特定用户发送消息 if(userAndSocketidMap[data.to]) { //注意了,1.0 之后的版本只能这么写了。预先把该user对应的socketid保存起来。 io.sockets.connected[userAndSocketidMap[data.to]].emit("say",data); } else { console.log("目标用户未上线"); } } });

//下线处理 socket.on("disconnect", function() { //若users与 userAndSocketidMap对象中保存了该用户 if(users[socket.name]) { //从users对象中删除 delete users[socket.name]; delete userAndSocketidMap[socket.name]; //向其它用户广播 该用户的下线消息 socket.broadcast.emit("offline",{users:users, user:socket.name}); } });

LZJwrtj commented 7 years ago

谢谢了,我已经解决了!!

既然选择了远方, 便只顾风雨兼程...

在2017年04月23日 13:32,echozhengnotifications@github.com 写道: 不好意思,这些天都没看邮箱。 对,是这样。我把关键代码贴出来,你自己再琢磨。

//存储用户以及它对应的socketid var userAndSocketidMap = {};

//socket.io 绑定客户端连接。 io.sockets.on("connection", function(socket) { socket.on("online", function(data) { //将上线的用户名存储为 socket对象的属性, //以区分每个socket对象,方便后面使用 socket.name = data.user;

//users对象中不包含 该用户名 则插入该用户名
if(!users[data.user]) {
    users[data.user] = data.user;
    var socketid = socket.id;

   //关键步骤
    userAndSocketidMap[data.user] = socketid;
}
//向所有用户广播该用户上线信息
io.sockets.emit("online", {users : users, user: data.user});

});

//服务器端处理客户端发送的 “say”事件 socket.on("say",function(data) { //向所有用户发送消息 if(data.to == "all") { socket.broadcast.emit("say",data); } else { //向特定用户发送消息 if(userAndSocketidMap[data.to]) { //注意了,1.0 之后的版本只能这么写了。预先把该user对应的socketid保存起来。 io.sockets.connected[userAndSocketidMap[data.to]].emit("say",data); } else { console.log("目标用户未上线"); } } });

//下线处理 socket.on("disconnect", function() { //若users与 userAndSocketidMap对象中保存了该用户 if(users[socket.name]) { //从users对象中删除 delete users[socket.name]; delete userAndSocketidMap[socket.name];

    //向其它用户广播 该用户的下线消息
    socket.broadcast.emit("offline",{users:users, user:socket.name});
}

});

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.

dogeow commented 7 years ago

该怎么说你们啊,代码都不用格式化的吗?@LZJwrtj @echozheng

rexleimo commented 5 years ago

就是就是