socket.io和node.js将消息发送到特定客户端

时间:2022-11-17 07:37:39

Sending message to all client works well but I want to send message to particular username. my server.js file looks like. What it does is when http://localhost:8080 is run, the client code adds user to the object usernames as well as in socket object. And instantly returns the individual message to each of the connected client.

向所有客户端发送消息的效果很好,但我想将消息发送到特定用户名。我的server.js文件看起来像。它的作用是运行http:// localhost:8080时,客户端代码将用户添加到对象用户名以及套接字对象中。并立即将单个消息返回给每个连接的客户端。

//var io = require('socket.io').listen(8080);
var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')
var usernames={};  
 app.listen(8080);

// on server started we can load our client.html page
function handler ( req, res ) {
  fs.readFile( __dirname + '/client.html' ,
  function ( err, data ) {
    if ( err ) {
      console.log( err );
      res.writeHead(500);
      return res.end( 'Error loading client.html' );
    }
    res.writeHead( 200 );
    res.end( data );
  });
};
io.set('log level', 1); // reduce logging
io.sockets.on('connection', function (socket) {

 socket.on('adduser', function(username){
        // store the username in the socket session for this client
        socket.username = username;
        // add the client's username to the global list
        usernames[username] = username;
        // send client to room 1
        console.log(username+' has connected to the server');
        // echo to client they've connected
  });

  socket.on('pmessage', function (data) {
        // we tell the client to execute 'updatechat' with 2 parameters
        io.sockets.emit("pvt",socket.username,data+socket.username); // This works
        io.sockets.socket(socket.username).emit("pvt",socket.username,data+socket.username); // THIS DOESNOT
   });

  socket.on('disconnect', function(){
        // remove the username from global usernames list
        delete usernames[socket.username];

        // echo globally that this client has left
       console.log(socket.username + ' has disconnected');
    });
});

The portion that emits message

发出消息的部分

socket.on('pmessage', function (data) {
        // we tell the client to execute 'updatechat' with 2 parameters
        io.sockets.emit("pvt",socket.username,data+socket.username); // This works and sends message to all clients
        io.sockets.socket(socket.username).emit("pvt",socket.username,data+socket.username); // THIS DOESNOT
   });

2 个解决方案

#1


10  

Try this:

尝试这个:

socket.on('pmessage', function (data) {
    // we tell the client to execute 'updatechat' with 2 parameters
    io.sockets.emit("pvt",socket.username,data+socket.username);
    io.sockets.socket(socket.id).emit("pvt",socket.username,data+socket.username); 
});

socket.id is saved by socket.io and it contains unique id of your client. You can check that using this:

socket.id由socket.io保存,它包含客户端的唯一ID。您可以使用以下方法检查:

console.log(socket.id);

#2


1  

You have to store all client ids and according to that you have to get id of particular client and then you use following code

您必须存储所有客户端ID,并根据您必须获取特定客户端的ID,然后使用以下代码

var store={};//this will store all client id and username e.g. store={jay:"34jhjshdj343sasa"}
socket.on('pmessage', function (data) {
    var receiverUserName=data.username;
    var message=data.message;
    var id = store[receiverUserName];//get ID
    // we tell the client to execute 'updatechat' with 2 parameters
    io.sockets.emit("pvt",socket.username,data+socket.username);
    io.sockets.socket(id).emit("pvt",socket.username,data+socket.username); 
});

Then this will emit on particular client

然后这将在特定客户端上发出

#1


10  

Try this:

尝试这个:

socket.on('pmessage', function (data) {
    // we tell the client to execute 'updatechat' with 2 parameters
    io.sockets.emit("pvt",socket.username,data+socket.username);
    io.sockets.socket(socket.id).emit("pvt",socket.username,data+socket.username); 
});

socket.id is saved by socket.io and it contains unique id of your client. You can check that using this:

socket.id由socket.io保存,它包含客户端的唯一ID。您可以使用以下方法检查:

console.log(socket.id);

#2


1  

You have to store all client ids and according to that you have to get id of particular client and then you use following code

您必须存储所有客户端ID,并根据您必须获取特定客户端的ID,然后使用以下代码

var store={};//this will store all client id and username e.g. store={jay:"34jhjshdj343sasa"}
socket.on('pmessage', function (data) {
    var receiverUserName=data.username;
    var message=data.message;
    var id = store[receiverUserName];//get ID
    // we tell the client to execute 'updatechat' with 2 parameters
    io.sockets.emit("pvt",socket.username,data+socket.username);
    io.sockets.socket(id).emit("pvt",socket.username,data+socket.username); 
});

Then this will emit on particular client

然后这将在特定客户端上发出