Как получить идентификатор сокета отключенного клиента на событие отключения в socket.io - PullRequest
1 голос
/ 14 марта 2019

Я начал работать над веб-приложением для othello .... в нем я использовал node.js и socket.io для обработки кода на стороне сервера.Он запускает файл 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] && 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, он возвращает неопределенное значение, я не знаю почему ... когда я регистрирую сам сокет, он говорит: транспорт закрыт.

Мой вопрос заключается в том, как получить идентификатор сокета дляигрок, который только что отключился.

Вот код на стороне клиента для обработки события 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 Ответ

0 голосов
/ 14 марта 2019

При отключении вы переопределяете переменную socket другим параметром обратного вызова. Попробуйте это:

/* disconnect command */
socket.on('disconnect', function() {
  console.log(socket.id);
});
...