我想在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;
Run Code Online (Sandbox Code Playgroud)
我想得到这个客户端的会话ID,我怎么能得到它?
在我的node.js/Express.js应用程序中,我需要使用socket.io连接传递参数(在另一篇文章中看到).
在客户端,我有类似的东西:
编辑
var socket = io.connect('/image/change', {query:"name=my_img_name"});
var siofu = new SocketIOFileUpload(socket);
siofu.listenOnInput(document.getElementById("change_image_inpt"));
Run Code Online (Sandbox Code Playgroud)
在服务器端:
编辑
io.of('/image/change')
.on('connection', function (socket) {
console.log('log input param : ' + socket.handshake.query.name);
});
Run Code Online (Sandbox Code Playgroud)
但是在控制台中什么都没有
还有另一种方法可以实现吗?
EDIT2
这是客户端的完整代码:
$(document).ready(function() {
// icon_action_modal
$('.icon_actions').on('click', function() {
// set icon preview
$('#icon_action_modal_icon_preview').html('<img src="/upload/icon/' + $(this).data('icon') + '.png" />');
// set icon to delete
$('#icon_name').val($(this).data('icon'));
// set Change icon socket
var socket = io.connect('/icon_sets/change', {query:"name=my_img_name"});
var siofu = new SocketIOFileUpload(socket);
siofu.listenOnInput(document.getElementById("change_icon"));
// Do something when a file is …
Run Code Online (Sandbox Code Playgroud) 我会跟踪数组中连接的每个用户的列表.因此,如果有新的连接,它将检查用户是否已经在列表中,如果他已经在列表中,然后在列表中分配他们的socket.id和相应的socket.id,否则只需添加它们到列表.
这是为了防止同一用户在尝试进行多重登录时被算作2个用户.
Object.keys(client).forEach(function (key) {
if (client[key].id == data.id){
is_connected = true;
socket.id = key;
}
});
Run Code Online (Sandbox Code Playgroud)
处理尝试多次登录的用户发送/接收的消息/聊天时没有问题.
socket.on('chat', function(msg){
var data = {"name": client[socket.id].name, "message": msg};
io.emit('chat', data);
});
Run Code Online (Sandbox Code Playgroud)
聊天消息的io.emit成功发送给尝试多次登录的用户.
我得到的问题是每当用户决定退出/断开服务器时.
io.emit('user_leave', client[socket.id].id);
Run Code Online (Sandbox Code Playgroud)
[多登录案例] - >多用户和双用户是尝试多重登录的同一用户
每当主用户与服务器断开连接时,双用户就会收到服务器发送的'user_leave',因为io.emit应该将其发送到所有套接字.
但不是这样,当子用户与服务器断开连接时,主用户不会收到服务器发出的"user_leave".
*注意:主用户先登录,然后双用户登录.因此,主用户信息直接保存在阵列中,而子用户socket.id则分配了主用户套接字.id
[更新]
B2 socket.id分配了B1 socket.id,io.emit用于聊天工作完美,而io.emit for disconnect只发送给All,除了双用户(B2)