【问题标题】:Get the disconnected user from socket.io从 socket.io 获取断开连接的用户
【发布时间】:2018-02-27 19:55:57
【问题描述】:

我正在用 Node.js 编写一个实时聊天系统。在用户与服务器连接的地方,我正在创建唯一的哈希键 [一次性创建] 并将他加入新的聊天室。我想显示用户是否在线。当用户断开套接字时,我无法进入用户的聊天室,因此我无法找到用户是否在线。请建议有没有更好的方法来做到这一点。

Server.js

socket.on('newUser',function (user) {
    chat.createChatRoom(con, user.email, user.phone, function (res,user_id,chatToken) {
        chatToken="TOK"+chatToken; //Here we using TOK for some identical purposes
        chatRoom(socket,chatToken,1);
        io.sockets.in(chatToken).emit('newUser', {chatToken:chatToken,user_id:user_id,response:res,rooms:io.sockets.adapter.rooms});
        io.emit('userConnects',chatToken);
        console.log(JSON.stringify(io.sockets.adapter.rooms));

    });
});

创建聊天室功能:

var createChatRoom = function (con, email, phone,callback) {
var chatToken = require('crypto').createHash('md5').update(email).digest("hex");
con.query("SELECT * FROM USER WHERE `email`='" + email + "'", function (error, result) {
    if (error) throw error;
    if (result.length == 0) {
        con.query("INSERT INTO user(email,chat_token,phone) VALUES('" + email + "','" + chatToken + "','" + phone + "')", function (error1, result1) {
            return callback(1,result1.insertId,chatToken);
        });
    } else {
        return callback(0,result[0].user_id,chatToken);
    }
});
};

当用户断开连接时,我想获得 chatToken。但我只能获取套接字 ID。

【问题讨论】:

    标签: javascript node.js sockets


    【解决方案1】:

    创建新聊天用户时,您还需要将 socket.id 存储在新用户的新列中。然后当用户断开连接时,您可以通过 socket.id 搜索用户。

    chat.createChatRoom(con, socket.id, user.email, user.phone, function (res,user_id,chatToken) {...})
    

    实际上,如果唯一的目的是识别套接字连接,您甚至不需要自己创建聊天令牌。因为 socket.id 是每个套接字连接的随机、不可猜测的唯一标识符。

    【讨论】:

    • 我想要一个唯一且永久的聊天令牌,以便我可以特别触发新消息。套接字 id 是随机的,因此我可以找到断开连接的用户。
    • @SarathKumar 每个房间可以连接多个套接字(用户),因此更好的办法是将属于聊天室的用户保留在另一个表中。因此,您可以在用户加入或断开连接时添加和删除用户(使用 socket.id 来识别房间成员)。房间不会断开连接,用户会。并且,您可以使用 chatToken 向房间的所有成员广播。
    • 但是我在这里为每个客户创建单独的聊天室。发送私人消息。
    • 然后在数据库中同时拥有 chatToken 和 socket.id。但是,您需要在每次用户加入时更新数据库中的 socket.id 并在用户断开连接时将其删除。
    • 您的意思是,我必须将socket.id 更新为chatToken。这样我就可以知道哪个用户断开了连接。
    【解决方案2】:

    检测用户是否断开连接的最佳方法是首先在套接字会话中设置用户名

    socket.on('newUser',function (username) {
                // we store the username in the socket session for this client
                socket.username = username;
    });
    

    当用户断开连接时,在断开连接事件中发现

    socket.on('disconnect', function () {
        var connectionMessage = socket.username + " Disconnected from Socket " + socket.id;
        console.log(connectionMessage);
      });
    

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2021-04-07
      • 2019-08-04
      • 2014-12-16
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多