#javascript #socket.io #client-server
#javascript #socket.io #клиент-сервер
Вопрос:
Я начал работать над веб-приложением для отелло …. в нем я использовал node.js и сокет.ввод-вывод для обработки кода на стороне сервера. Он запускает server.js файл в облаке.
Этот файл обрабатывает некоторые из основных событий клиента, одним из которых является событие отключения.
Вот код для события отключения:
io.sockets.on('connection', function(socket) {
log('Client connection by ' socket.id);
function log(){
var array = ['*** Server log Message'];
for(var i=0; i< arguments.length; i ) {
array.push(arguments[i]);
console.log(arguments[i]);
}
socket.emit('log', array);
socket.broadcast.emit('log', array);
}
/* disconnect command */
socket.on('disconnect', function(socket) {
log(socket);
log('Client disconnected ' JSON.stringify(players[socket.id]));
if('undefined' !== typeof players[socket.id] amp;amp; players[socket.id]) {
var username = players[socket.id].username;
var room = players[socket.id].room;
var payload = {
username: username,
socket_id: socket.id
};
delete players[socket.id];
io.in(room).emit('player_disconnected', payload);
}
});
});
Эта команда отключения должна уведомить все другие сети об отключенном проигрывателе и удалить данные о нем.
Вот код для хранения временных данных активных игроков:
/* join_room command */
socket.on('join_room', function(payload) {
log(''join_room' command ' JSON.stringify(payload));
if(('undefined' === typeof payload) || !payload) {
var error_message = 'join_room had no payload, command aborted';
log(error_message);
socket.emit('join_room_response', {
result: 'fail',
message: error_message
});
return;
}
var room = payload.room;
if(('undefined' === typeof room) || !room) {
var error_message = 'join_room didn't specify a room, command aborted';
log(error_message);
socket.emit('join_room_response', {
result: 'fail',
message: error_message
});
return;
}
var username = payload.username;
if(('undefined' === typeof username) || !username) {
var error_message = 'join_room didn't specify a username, command aborted';
log(error_message);
socket.emit('join_room_response', {
result: 'fail',
message: error_message
});
return;
}
/* store information about new player */
players[socket.id] = {};
players[socket.id].username = username;
players[socket.id].room = room;
log(players);
socket.join(room);
var roomObject = io.sockets.adapter.rooms[room];
/* notify others about new player */
var sumCleints = roomObject.length;
var data = {
result: 'success',
room: room,
username: username,
socket_id: socket.id,
membership: sumCleints
};
io.in(room).emit('join_room_response', data);
for(var socket_in_room in roomObject.sockets) {
var data = {
result: 'success',
room: room,
username: players[socket_in_room].username,
socket_id: socket_in_room,
membership: sumCleints
};
socket.emit('join_room_response', data);
}
log('join_room success');
log('Room: ' room ' was just joined by ' username)
});
Но проблема в том, что это не так. Когда я зарегистрировал socket.id он возвращает undefined, я не знаю почему … когда я регистрирую сам сокет, он сообщает: транспорт закрыт.
Мой вопрос заключается в том, как получить идентификатор сокета игрока, который только что отключился.
Вот код на стороне клиента для обработки события player_disconnected:
/* when someone leaves a room */
socket.on('player_disconnected', function(payload) {
if (payload.result == 'fail') {
alert(payload.message);
return;
}
if(payload.socket_id == socket_id) {
return;
}
/* Delete all rows for new players that leave */
var dom_elements = $('.socket_' payload.socket_id);
if(dom_elements.length != 0) {
dom_elements.slideUp(1000);
}
var newHTML = '<p>' payload.username ' has left the lobby</p>';
var newNode = $(newHTML);
newNode.hide();
$('#messages').append(newNode);
newNode.slideDown(1000);
});
Если кто-нибудь может разобраться в проблеме, пожалуйста, скажите мне, и, пожалуйста, расскажите мне, как на самом деле работает событие отключения и другие события и каковы параметры для них, потому что я не смог найти никакой полезной информации в документах… Заранее спасибо.
Ответ №1:
При отключении вы переопределяете socket
переменную другим параметром обратного вызова. Попробуйте это:
/* disconnect command */
socket.on('disconnect', function() {
console.log(socket.id);
});
Комментарии:
1. да! вы правы, была эта небольшая ошибка, которую я не смог сначала найти, в следующий раз я позабочусь, прежде чем задавать глупые вопросы … большое спасибо.
2. Не могли бы вы, пожалуйста, сказать мне, каковы параметры для события отключения? Например, если я напишу следующий код:- /* команда отключения */ socket.on(‘disconnect’, функция(полезная нагрузка) { console.log(полезная нагрузка); });
3. Предопределенного параметра как такового нет, но вы можете передавать пользовательские параметры при вызове
socket.disconnect