如何在客户端中获取 socket.io 客户端的会话 ID

Posted

技术标签:

【中文标题】如何在客户端中获取 socket.io 客户端的会话 ID【英文标题】:how to get session id of socket.io client in Client 【发布时间】:2011-10-22 05:46:07 【问题描述】:

我想在我的 socket.io 客户端中获取客户端的会话 ID。

这是我的 socket.io 客户端:

var socket = new io.Socket(config.host, port: config.port, rememberTransport: false);
    // when connected, clear out display
    socket.on('connect',function() 
        console.log('dummy user connected');
    );
    socket.on('disconnect',function() 
        console.log('disconnected');
    );
    socket.connect();
    return socket;

我想获取该客户端的会话 id,如何获取?

【问题讨论】:

由 socket.transport.sessionid 获得。 socket.sessionid 或 socket.transport.sessid Socket.io custom client ID的可能重复 【参考方案1】:

看看 my primer 就知道这个话题了。

更新:

var sio = require('socket.io'),
    app = require('express').createServer();

app.listen(8080);
sio = sio.listen(app);

sio.on('connection', function (client) 
  console.log('client connected');

  // send the clients id to the client itself.
  client.send(client.id);

  client.on('disconnect', function () 
    console.log('client disconnected');
  );
);

【讨论】:

请告诉如何在客户端获取会话ID? 在 cookie 中。要么从那里抓取它 (document.cookie),要么从服务器显式发送给客户端。 我在连接的一个客户端中签入了 document.cookie,但它是空白的。 我们在谈论什么会话 id? socket.socket.sessionid,或本例中的client.socket.sessionid【参考方案2】:

在 socket.io >=1.0,连接事件触发后:

var socket = io('localhost');
var id = socket.io.engine.id

【讨论】:

socket.on 'connect'之后才能拿到 @webjay 是的,属性只在连接事件上分配,而不是之前。 所以你现在设置引擎如何从服务器获取它? 对我有用!不必在 socket.on 'connect' 上使用它【参考方案3】:

我刚刚遇到同样的问题/问题并像这样解决了它(仅限客户端代码):

var io = io.connect('localhost');

io.on('connect', function () 
    console.log(this.socket.sessionid);
);

【讨论】:

使用 socket.io 1.4.5 为我返回了“未定义” 感谢信息,我猜 socket.io 自 2013 年以来发生了一些变化 :) - 我将很快对其进行测试并更新我的答案。【参考方案4】:

* 请注意:从 v0.9 开始,setget API 已被弃用 *

以下代码应仅用于版本 socket.io :http://socket.io/docs/migrating-from-0-9/

可以通过握手/授权机制来完成。

var cookie = require('cookie');
io.set('authorization', function (data, accept) 
    // check if there's a cookie header
    if (data.headers.cookie) 
        // if there is, parse the cookie
        data.cookie = cookie.parse(data.headers.cookie);
        // note that you will need to use the same key to grad the
        // session id, as you specified in the Express setup.
        data.sessionID = data.cookie['express.sid'];
     else 
       // if there isn't, turn down the connection with a message
       // and leave the function.
       return accept('No cookie transmitted.', false);
    
    // accept the incoming connection
    accept(null, true);
);

分配给数据对象的所有属性现在都可以通过 socket.io 连接对象的握手属性访问。

io.sockets.on('connection', function (socket) 
    console.log('sessionID ' + socket.handshake.sessionID);
);

【讨论】:

【参考方案5】:

在服务器端

io.on('connection', socket => 
    console.log(socket.id)
)

在客户端

import io from 'socket.io-client';

socket = io.connect('http://localhost:5000');
socket.on('connect', () => 
    console.log(socket.id, socket.io.engine.id, socket.json.id)
)

如果socket.id 不起作用,请确保在on('connect') 或连接后调用它。

【讨论】:

【参考方案6】:

由于某种原因

socket.on('connect', function() 
    console.log(socket.io.engine.id);
); 

对我不起作用。不过

socket.on('connect', function() 
    console.log(io().id);
); 

确实为我工作。希望这对那些在获取 id 方面也有问题的人有所帮助。顺便说一句,我使用 Socket IO >= 1.0。

【讨论】:

事件函数接收一个变量,里面有你想要的:io.on('connection', function(client) console.log(client.id); );【参考方案7】:

从您的代码中尝试 socket.socket.sessionid 即。

    var socket = io.connect('http://localhost');
alert(socket.socket.sessionid);
  var sendBtn= document.getElementById('btnSend');
  sendBtn.onclick= function()
var userId=document.getElementById('txt1').value;
var userMsg = document.getElementById('txt2').value;
socket.emit('sendto',username: userId, message: userMsg);
;

  socket.on('news', function (data) 
    console.log(data);
    socket.emit('my other event',  my: 'data' );
  );
  socket.on('message',function(data) console.log(data););

【讨论】:

【参考方案8】:

试试这个方法。

                var socket = io.connect('http://...');
                console.log(socket.Socket.sessionid);

【讨论】:

以上是关于如何在客户端中获取 socket.io 客户端的会话 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在socket.io中的断开事件上获取断开连接的客户端的套接字ID

如何使用套接字(socket.io)在 NodeJS 中找到客户端的响应时间(延迟)?

如何更新房间内所有客户端的套接字对象? (socket.io)

使用带有 Socket.io IOS 客户端的客户端证书

在 socket.io 中控制来自客户端的心跳超时

socket.io 在空闲时断开客户端的连接