如何在客户端中获取 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 开始,set
和 get
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 中找到客户端的响应时间(延迟)?