【问题标题】:Socket.io : Get Client sessionID at any pointSocket.io:随时获取客户端 sessionID
【发布时间】:2013-11-19 05:37:17
【问题描述】:

我知道如何在用户连接时检索客户端 sessionID。

但我想随时检索它,例如当客户点击某物时,我希望能够知道谁点击了,他们的 sessionID 是什么。

socket.sessionID 不起作用,socket.handshake.sessionID 也不起作用

例如:

我有这条快速路线:

.get('/result/:survey', function(req, res) {
    res.redirect('/result/'+req.params.survey+'/1');
})

就在重定向之前,我想让用户加入一个套接字房间,并获得他们的 sessionID。我怎么可能这样做?根据文档,它将是socket.join('room'),但我怀疑socket仅代表我与客户端的连接,而不是与其他客户端的连接。也许我只是无法理解套接字!

【问题讨论】:

  • 一旦您重定向到另一个 URL,套接字连接将丢失(它们在页面加载时不会持久)并且您的客户端将不得不重新连接(并获取新的套接字 ID)。跨度>
  • @robertklep 哦,好吧。但是他们的handshake.sessionID 应该保持不变,对吧?
  • 听起来您应该使用 cookie 来存储 clientId,因此每个客户端始终是唯一的
  • handshake.sessionID 不是socket.io 协议的一部分,但通常通过解析会话cookie 在io.set('authorization', ...) 中设置。如果这就是你正在使用的,它应该保持不变,是的。

标签: javascript node.js sockets express socket.io


【解决方案1】:

从 1.0 版开始,您可以通过以下方式获取客户端的 sessionid:

var socket = io();
socket.on('connect', function(){
    var sessionid = socket.io.engine.id;
    ...
});

【讨论】:

    【解决方案2】:

    我不确定您的确切意思,因为“当客户端单击某物时”假定您的意思是“客户端”(您可以在其中使用 socket.socket.sessionid)但“将其存储在客户端数组中”假设您的意思是“服务器端”(您可以通过 socket.id 访问它)。

    客户端:

    var socket = io.connect();
    socket.on('connect', function() {
      var sessionid = socket.socket.sessionid;
      ...
    });
    

    服务器端:

    io.sockets.on('connection', function(socket) {
      var sessionid = socket.id;
      ...
    });
    

    【讨论】:

    • 在您的情况下,什么是“套接字”?因为,服务器端,我的变量是:io 是 socket.io,socket 是 io.listen(app.listen(8000))。我有点迷路了。
    • 谢谢,我将编辑我的问题,尝试解释“在任何时候”的含义。
    【解决方案3】:

    我将客户端 ID 存储在服务器端事件处理程序中,只需:

    // server.js
    io.sockets.on('connection', function (client) {
      client.on('event_name', function (_) {
        var clientId = this.id;
      }
    }
    

    【讨论】:

    • 这不会帮助我在任何时候识别客户(我同时有几个用户)
    • 试试看。很确定它会做你需要的。客户端由 id, afaik 唯一标记。
    • @RomainBraun 我认为您需要指定“在任何时候”的含义
    • @robertklep 是的,我知道,但我有点迷失自己,所以很难解释
    • @robertklep 如果你还没有,请阅读 github 上的 socket.io wiki。它帮助了我。特别是关于会话管理的几个部分。
    【解决方案4】:

    我使用的是 socket.io 版本 2.0.4,您可以在任何时间点通过在处理程序中使用 this.id 访问客户端 ID。例如:

    socket.on('myevent',myhandler);
    function myhandler(){
        console.log('current client id: '+this.id);
    }
    

    显然,处理函数是在 Socket 上下文本身中执行的,这同样可以让您访问其他自属性,例如 client(连接的客户端对象)、request(正在处理的当前请求对象)等。你可以在这里查看完整的 API https://socket.io/docs/server-api/#socket

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 2013-05-07
      • 2014-11-25
      • 2018-06-25
      • 1970-01-01
      • 2013-10-16
      • 2011-09-21
      • 1970-01-01
      相关资源
      最近更新 更多