我如何只向目标用户发射?

时间:2016-01-26 19:35:33

标签: node.js express socket.io

我的目标是向其他用户发送实时通知。

  1. 用户A浏览,找到用户B
  2. 用户A点击添加好友
  3. 用户B收到通知
  4. 我使用了iosocket来发光,发生了什么

    1. io case,就是它向所有连接的用户发出。
    2. socket case,就是它自己发出的。
    3. 如果您看到下面的代码,我使用socket.request.user,我从使用passport.socketio库获得了这个,只是想澄清一下。

      代码

      了Serverside

      io.on('connection', function() {
         socket.on('friendsRequest', function(data) {
            var userId = data;
      
            User.update(
              {
                _id: userId,
                'friendsRequested.requestee': { $ne: socket.request.user._id}
              },
              {
                $push: { friendsRequested: { requestee: socket.request.user._id } },
              }, function(err, count) {
                if (err) return next(err);
                console.log("Successful");
                socket.emit('friendsRequest', socket.request.user);
              });
            });
      
      });
      

      客户端

      $(document).on('click', "#addFriend", function(e){
        e.preventDefault();
        var userId = $('#userId').val(); // Getting the userId from the input hidden (This is User B _id from mongoDB)
        $('#addFriend').removeClass('btn-default').addClass('btn-success') // Change the button to green color
        .html('<span class="glyphicon glyphicon-ok"></span> Added').attr('id', 'addFriend');
        socket.emit('friendsRequest', userId); // Emit the userId back to the server.
      });
      
      socket.on('friendsRequest', function(data) { // if successful
      
        var totalRequests = parseInt($('#totalRequests').html()); // Get the current total friendsRequest
        totalRequests += 1; // Increment by 1
        $('#totalRequests').html(totalRequests); // Change it to the current totalRequest
        $('#friendsRequested').append('<li>' + data._id + '</li>');
      });
      

      再说一次,假设用户A点击了用户B页面上的添加好友按钮,只有用户B如何获得通知而不是用户A?

3 个答案:

答案 0 :(得分:0)

以下代码显示了仅基于套接字的简约但可运行的示例:

var net = require('net');
var users = [];    // sockets are stored here

var server = net.createServer(function(socket) {
    users.push(socket);                      // store socket to var users
    socket.write('you are connected\n');     // message to current socket
    for (var i=0; i<users.length; i++) {
        if (users[i] == socket) {
            continue;                        // skip current socket
        }
        users[i].write('new user joined\n'); // send to all other sockets
    }
}).listen(3000);

您必须存储每个套接字才能单独使用每个套接字。

上面的示例显示了如何避免某个特定套接字但如果您只想使用一个特定套接字,则它是一个类似的过程。

正如malix指出的那样,您需要添加一个信息,以便以后能够识别某个套接字,例如:电子邮件地址或用户ID。

答案 1 :(得分:0)

每个套接字都由一个id标识,已知它只能发送到这个套接字,如下所示:

io.sockets.connected[id].emit('friendsRequest', data);

因此,您可以将userId设置为从客户端发送它的每个套接字的属性,例如(服务器端):

socket.on('setuserid, function(data){
    socket.userid=data;
})

或者使用passport.socketio也许你可以这样做:

socket.on('setuserid, function(){
    socket.userid=socket.request.user._id;
})

当发送好友请求时,循环连接的套接字(服务器端):

 socket.on('friendsRequest', function(data) {
  var userId = data;

  User.update(
    {
      _id: userId,
      'friendsRequested.requestee': { $ne: socket.request.user._id}
    },
    {
      $push: { friendsRequested: { requestee: socket.request.user._id } },
    }, function(err, count) {
      if (err) return next(err);
      console.log("Successful");

       for (s in io.sockets.connected) {

         if (userId==io.sockets.connected[s].userid) {

          io.sockets.connected[s].emit('friendsRequest', socket.request.user);
          break;

        };
      }

    });
  });

答案 2 :(得分:-1)

我们在Express上使用feathers并通过电子邮件存储套接字:

var app = feathers(); // same as app = express();
app.sockets = {};

//...

io.on('connection', function(socket) {
  // feathers puts the current user on the socket object for you, but you can roll your own
  // in that case, replace email with some other unique user data
  var email = socket.feathers.user.email; 
  if (email) {
    app.sockets[email] = socket;
  }
  

请注意socket来自io.on('connection')

的参数[0]

然后你可以定位任何电子邮件..

//find the user's socket and emit to it...
var target = app.sockets[toEmail];
target && target.emit('friendsRequest', {
        message: 'whatever',
        broadcast: false
      });
顺便说一下,你没有需要 羽毛 ...如果你不这样做,只需将一些独特的用户数据与'连接'上的套接字相关联,如果只想向该用户发送内容,请查找套接字...