【问题标题】:send message to one user using Socket.io使用 Socket.io 向一位用户发送消息
【发布时间】:2018-01-14 05:53:58
【问题描述】:

我正在寻找使用 nodejs、socket.io、Redis 向特定客户端发送消息的方法。(这也意味着跟踪该用户)

请帮忙

编辑

var app = require('express')();

var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');
var user=[];

server.listen(3000);
io.on('connection', function (socket) {

    var redisClient = redis.createClient();
    redisClient.subscribe('message');

    user[socket.handshake.query.userid] = socket;

    socket.on('create', function(id) {
        user[id] = socket;
    });


    redisClient.on("message", function(channel, message) {
        var message=JSON.parse(message);
        var id=JSON.parse(message.id);
        var target=id;

        console.log("target id => "+user[target].id+" / socket.id => "+socket.id)

         try{
             if(user[target].id==socket.id){
                  user[target].emit(channel,message.msg);
              }else{
                  console.log('when socket.id dont match')
               }
         }catch (e){
             console.log(e);
         }
      console.log("\n#########################\n");

    });



});

【问题讨论】:

    标签: node.js redis socket.io


    【解决方案1】:

    确实,您需要存储传入连接。
    客户:

    var userid = '69b6';//anything you like
    var con = io.connect('localhost:4545/', { query: `userid=${userid}` });
    

    服务器:

    var users = {} ;
    io.on('connection', function(client){
      users[client.handshake.query.userid] = client;
    });
    
    //you want to send something to a user
    users[userid].emit('yolo', data);
    

    编辑:我修改了你的代码

    var server = require('http').Server(app);
    var io     = require('socket.io')(server);
    var redis  = require('redis');
    var users  = {};
    
    server.listen(3000);
    
    var redisClient = redis.createClient();
    
    io.on('connection', function (socket) {
      var userId     = socket.handshake.query.userid;
      users[userId]  = socket;
    });
    
    redisClient.subscribe('message');
    redisClient.on("message", function(channel, message) {
      var message     = JSON.parse(message);
      var userId      = message.id;
      var userSocket  = users[userId] || null;
    
      console.log('=======[Message received]=======');
      console.log('UserId:', userId);
      console.log('SocketId:', userSocket.id);
    
      if(userSocket){
        userSocket.emit(channel, message.msg);
        console.log("Message was succefully sent!");
      }else{
        console.log('User socket unavailable');
      }
    });
    

    告诉我它是否有效,如果您难以理解我所做的更改。

    【讨论】:

    • 谢谢。它工作但是当有 2 个客户端连接时,..第一个客户端 (A) 收到 2 条消息...这意味着 n 个客户端连接,目标客户端收到 n 条消息...如何纠正这个?
    • 这是我的日志:########################第一次发送的消息sockts.id不同 target id => **kj0xdeHjrsGC1s_wAAAC** / socket.id => **-nzAKADd-31wJnFlAAAB** mew message in queue [] / channel : message / Time 1502098774452 target => user17 ########################第二次发送消息sockts.id匹配 target id => **kj0xdeHjrsGC1s_wAAAC** / socket.id => **kj0xdeHjrsGC1s_wAAAC** mew message in queue [] / channel : message / Time 1502098774453 target => user17
    • 不是同一个socketid,而是同一个用户user17。你能告诉我你发送消息并在服务器端注册连接的代码吗?没有代码我无法真正理解这个问题。
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2014-08-14
    • 2011-06-06
    • 2011-10-18
    相关资源
    最近更新 更多