2013-11-07 5 views
7

Я знаю, как получить клиентский идентификатор сеанса при подключении пользователя.Socket.io: Получить идентификатор клиента в любой точке

Но я хотел бы получить его в любое время, например, когда клиент нажимает на что-то, я хотел бы знать, кто нажал, что такое идентификатор sessionID.

socket.sessionID не работает, и не socket.handshake.sessionID

Например:

У меня есть этот экспресс-маршрут:

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

Непосредственно перед перенаправлением, я хотел бы сделать пользователю присоединитесь к сокетной комнате, а также получите их sessionID. Как я мог это сделать? Согласно документу, это будет socket.join('room'), но я сомневаюсь, что socket представляет только соединение, которое у меня есть с клиентом, а не с другими клиентами. Может быть, у меня просто проблемы с пониманием сокетов!

+0

После перенаправления на другой URL соединение сокета будет потеряно (они не будут сохраняться при загрузке страниц), и вашему клиенту придется повторно подключиться (и получить новый сокет Я бы). – robertklep

+0

@robertklep Оооо хорошо. Но их 'handshake.sessionID' должен оставаться тем же, не так ли? –

+0

Похоже, что вы должны использовать cookie для хранения 'clientId', поэтому он всегда уникален для каждого клиента. – megawac

ответ

19

Начиная с версии 1.0, вы получаете сеанс клиента таким образом:

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

Я не уверен, что вы имеете в виду, потому что «когда клиент нажимает на что-то» предполагает, что вы имеете в виду «клиентская сторона» (где вы можете использовать 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; 
    ... 
}); 
+0

Что такое «разъем» в вашем случае? Потому что, на стороне сервера, мои переменные: io - socket.io, socket is io.listen (app.listen (8000)). Я потерян. –

+0

@RomainBraun отредактировал мой ответ, чтобы сделать его более понятным :) – robertklep

+0

Спасибо, я отредактирую свой вопрос, чтобы попытаться объяснить, что означает «в любой момент». –

0

хранить клиентские идентификаторы в обработчики событий на стороне сервера просто с:

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

Это не помогло бы мне идентифицировать клиента в любой момент (у меня одновременно есть несколько пользователей) –

+0

попробуйте. уверен, что он сделает то, что вам нужно. клиент уникально отмечен id, afaik. –

+0

@RomainBraun Я думаю, вам нужно указать, что вы подразумеваете под «в любой точке» – robertklep

0

Я использую socket.io версии 2.0.4, и вы можете получить доступ к идентификатору клиента в любой момент времени, используя this.id в обработчике. Например:

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

Очевидно, функция обработчика выполняется в самом контексте сокета, который так же даст вам доступ к другим самостоятельным свойствам, как client (подключенному объекта Client) request (текущий объект запроса в обработке), и т. д. Здесь вы можете увидеть полный API. https://socket.io/docs/server-api/#socket

Смежные вопросы