我怎样才能得到一个 socket.username ? (socket.io)

Posted

技术标签:

【中文标题】我怎样才能得到一个 socket.username ? (socket.io)【英文标题】:How I can get a socket.username ? (socket.io) 【发布时间】:2015-12-15 22:04:01 【问题描述】:

我想写一个简单的聊天来获得实践经验。

好的,但我无法获取 socket.nickname 来通知加入/离开房间。 (当我试图通过它时,他总是难过一个'未定义')。

现在好了,尝试创建房间列表

更新代码:

client.js:

$('#roomForm').submit(function() 
    socket.emit('createRoom', $('#roomName').val());
    $('#roomForm').hide();
    $('#chatForm').show();
    return false;
);

socket.on('message', function(data) 
    newMessage(data);
);

socket.on('showRooms', function(rooms) 
    console.log(rooms);
    for(var i = 0; i < rooms.length; i++) 
        $('#rooms').append($('<li>')
                        .append($('<form id="freeRoom">')
                            .append($('<span id="room">').text(rooms[i] + ' ///'))
                            .append($('<button>').text('connect'))));
    ;
);

$('#freeRoom').submit(function() 
    socket.emit('connectToRoom', $('#room').text());
    return false;
);

server.js:

io.on('connection', function(socket) 
    socket.on('sendNickname', function(username) 
        socket.username = username;
        users.push(socket.username);
        socket.emit('showRooms', rooms);
    );

    socket.on('disconnect', function() 
        socket.broadcast.to(socket.room).emit('notice', socket.username + ' has left the room');
        users.splice(users.indexOf(socket.username), 1);
        socket.emit('showRooms', rooms);
    );

    socket.on('message', function(data) 
        socket.broadcast.to(socket.room).emit('message', data);
    );

    socket.on('createRoom', function(room) 
        socket.leave(socket.room);
        socket.room = room;
        rooms.push(socket.room);
        socket.join(socket.room);
        socket.emit('showRooms', rooms);
        console.log('Rooms: ' + rooms);
        socket.broadcast.to(socket.room).emit('notice', socket.username + ' has joined to room');
    );

    socket.on('connectToRoom', function(room) 
        console.log('Will connect to that room: ' + room);
        socket.join(room);
    );
);

**更新 2:** 尝试连接免费创建的房间:

$('#freeRoom').submit(function() 
    socket.emit('connectToRoom', $('#room').text());
    return false;
);

附:还有...对不起我的英语>.

【问题讨论】:

向我们展示您在客户端使用的代码,您如何连接?你确定 socket.on('connect', ...) 中的函数被调用了吗? @misko321 Ofc,但我无法在服务器端获取用户,添加了 clients.js 看这个问答:***.com/questions/17287330/… 最佳解决方案在这里 - ***.com/a/39711590/984471 【参考方案1】:

您发出的事件名称,即 'connect''message' 一起保留在 Socket.io 中>'断开'

http://socket.io/docs/#sending-and-receiving-events

Socket.IO 允许您发出和接收自定义事件。除了 connectmessagedisconnect,您可以发出自定义事件: ...

改成别的,例如:

Server.js:

io.on('connection', function(socket) 
socket.on('send-nickname', function(nickname) 
    socket.nickname = nickname;
    users.push(socket.nickname);
    console.log(users);
);
...

客户端.js

socket.emit('send-nickname', nickname);

【讨论】:

哦,谢谢!!!!这个简单的麻烦,所有的工作,但我有几个问题......房间什么时候被删除了? (什么时候在这个房间里没有用户或什么?) 似乎确实,当所有用户都离开时,房间会自动删除:***.com/a/8750801/4228291 很好,最后一个问题,我正在尝试列出所有房间(用于用户连接),并且,当房间被删除或创建时,我无法“重新加载”所有列表(代码已更新)。 *并尝试连接空闲房间(在显示的房间列表中) 如果您想在每次创建新房间或删除现有房间时更新房间列表,您只需添加一个新事件(例如 'rooms-reload'/'rooms-refresh ') 并在发生这种情况时从服务器发出消息,然后当然更新客户端应用程序中的列表。关于你的第二个问题:你已经有事件'connectToRoom'。你还需要什么?我只建议将用于在 server.js 中创建和加入房间的代码拆分为两个单独的方法。

以上是关于我怎样才能得到一个 socket.username ? (socket.io)的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能只得到 ZRANGEBYSCORE 的第一个结果?

我怎样才能得到一个字符串的所有字谜

我怎样才能得到 UILabel 的高度?

我怎样才能得到一个值的二进制表示[重复]

NAudio:我怎样才能得到一个告诉我 MP3 文件已结束的事件?

GeoDjango:我怎样才能得到两点之间的距离?