如何从socket.io服务器向特定客户端发送请求?

时间:2017-12-21 06:38:36

标签: node.js sockets npm socket.io

我将用户数据保存在数组中,请参阅以下代码 服务器代码

socket.on('add user', function(data) {
   if (users.indexOf(data.id) == -1) {
    users.push({
            id: socket.id,
            userId: data.id,
            firstName: data.firstName,
            lastName: data.lastName
        });     
    }

    len = users.length;
    len--;
    io.emit('user join', users, users[len].userId, users[len].id);
});

我是从前端向用户发送请求,以便首先检查用户是否在线,以便向特定用户发送请求。如果用户在那里我根据我发送的数据将用户socket.id分配给userId变量,请参阅下面的代码 服务器代码

socket.on('addNewFriend', function(userId) {
    console.log(userId);
    for(var i=0;i<users.length;i++){
        if(users[i].userId==userId){
            var socketid=users[i].id;
            console.log(socketid);
    io.to(socketid).emit('addFriend',"hai");

        }
    }


});

1 个答案:

答案 0 :(得分:1)

不要只保留套接字ID,也要保持套接字连接本身。

users.push({
    id: socket.id,
    socket: socket
    userId: data.id,
    firstName: data.firstName,
    lastName: data.lastName
});   

如果你使用地图而不是数组来保存用户会更容易,

users[socket.id] = {
    socket: socket
    userId: data.id,
    firstName: data.firstName,
    lastName: data.lastName
}

然后,当您要发送消息时,请使用套接字连接

users[socketId].socket.emit(/*args*/)

如果您将套接字保存在数组中,则需要手动过滤用户对象,然后执行相同操作。

编辑:因此,侦听器的完整代码如下所示,

socket.on('addNewFriend', function(userId) {
    for(var i=0;i<users.length;i++){
        if(users[i].userId == userId){
            var socketId = users[i].id;
            console.log(socketId);
            users[socketId].socket.emit('addFriend', "hai");
        }
    }
});