Nodejs Socket.io 发送私信

最近对 Nodejs 有点兴趣,于是搭了个环境做了一些小Demo,其中有一个就是使用Socket.io做的一个聊天室。

聊天室中除了群发消息之外还有私有信息的发送。于是把代码放出来,也算是做个笔记。
参考资料

以下为核心代码app.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var users = {};
io.on('connection'function(socket){
    socket.on('disconnect'function(){
        console.log('user disconnected');
    });

    socket.on("adduser",function(data,callback){
        if (data in users){
            callback(false);
        } else{
            callback(true);
            socket.nickname = data;
            users[socket.nickname] = socket;
            updateNicknames();
        }
    });

    function updateNicknames(){
        io.sockets.emit('usernames'Object.keys(users));
    }

    socket.on("privatemsg",function(to,data,callback){
        console.log(to,data);
        if(to in users){
            users[to].emit('sendback', {msg: data, nick: socket.nickname});
        } else{
            callback('Error!  Enter a valid user.');
        }
    });
});

以下为界面脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$("#adduser").on("click",function(){
    socket.emit("adduser",$("#name").val(),function(data){
        //console.log(data);
    });
});

$("#sendprivate").on("click",function(){
    socket.emit("privatemsg",$("#privateuser").val(),$("#privatemsg").val(),function(data){
        //console.log(data);
    });
});

socket.on("sendback",function(data){
    console.log(data);
    $('#result').append($('<li>').text(data.msg));
});

socket.on("usernames",function(data){
    console.log(data);
});

其中的原理就是把新增的新用户放到一个变量中(users),同时把当前的socket对象赋值给当前的(users[user])。

当发送私有数据时,先判断用户是不是在用户集中,如果存在就使用当前用户(users[to])的socket发送私信。