简体   繁体   English

如何在socket.io中的断开事件上获取断开连接的客户端的套接字ID

[英]How to get the socket id of a disconnected client on the disconnect event in socket.io

I have started working on a web application for othello.... in it I used node.js and socket.io for handling the server side code. 我已经开始为othello开发Web应用程序...。在其中,我使用node.js和socket.io来处理服务器端代码。 It runs a server.js file in the cloud. 它在云中运行server.js文件。

This file handles some of the main client events, one of them is the disconnect event. 该文件处理一些主要的客户端事件,其中之一是断开事件。

Here's the code for disconnect event: 这是断开事件的代码:

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);
    }
    });
});

This disconnect command should notify all the other cleints about the disconnected player and delete the data about it. 此断开连接命令应将断开连接的播放器通知所有其他部门,并删除有关其的数据。

Here's the code for holding the temporary data of the active players: 以下是用于保存活动播放器临时数据的代码:

/* 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)
});

But the issue is it doesn't. 但问题是事实并非如此。 When I logged the socket.id, it returns undefined, I don't know why ... when I log the socket itself, it says: transport closed. 当我记录socket.id时,它返回未定义,我不知道为什么……当我记录套接字本身时,它说:传输关闭。

My question is how to get the socket id of a player who just disconnected. 我的问题是如何获取刚刚断开连接的播放器的套接字ID。

Here's the client side code for handling the player_disconnected event: 这是用于处理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);
});

If someone could figure out the problem than please tell me, and please tell me how the disconnect event, and the other events actually work and what are the parameters for them, because I couldn't find any useful information in the docs... Thanks in advance. 如果有人可以找出问题,那么请告诉我,然后告诉我断开事件,其他事件的实际工作方式以及它们的参数是什么,因为我在文档中找不到任何有用的信息...提前致谢。

On disconnect, you are overriding the socket variable with a different callback parameter. 断开连接时,您将使用其他回调参数覆盖socket变量。 Try this: 尝试这个:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM