【问题标题】:How to show online users in socket.io server in node.js?如何在 node.js 的 socket.io 服务器中显示在线用户?
【发布时间】:2022-01-02 06:08:16
【问题描述】:

我正在创建一个国际象棋游戏网站。当用户点击在线播放时,我需要显示可用的在线播放器。从在线播放器列表中,用户可以单击并向他们发送请求以进行播放。现在我的主要问题是我是 socket.io 的新手,并没有在网上找到任何关于此的资源。我并不是要显示单个房间中可用的用户,而是显示整个套接字服务器可用的播放器。 Here Online Players will be shown in a list

function sendName(name) {
  var isNameValid = true;
  for (var i = 0; i < users.length; i++) {
    if (users[i].name === name) {
      isNameValid = false;
      console.log(name + " is already taken");
      console.log(users);
      socket.emit("nameError", "Name already exists, Try again");
      return;
    }
  }
  if (isNameValid) {
    var room = generateRoomId();
    users.push({ id: socket.id, name: name, room: room });
    socket.join(room);
    socket.emit("roomId", room);
  }
}

所有用户都被推送到服务器端的用户数组中。但我不知道如何在客户端获取他们的姓名和房间信息,然后在前端显示。

<div>
            <h3 style="color:white;">Online Players</h3>
                    <ul id="users">
                    </ul>
</div>

在线玩家将在此处显示。 此外,当一个用户断开在线玩家列表时,我认为套接字可以刷新。我正在做一个项目,任何帮助都将不胜感激,我也会从中学习。

【问题讨论】:

    标签: javascript html jquery node.js socket.io


    【解决方案1】:

    我正在为服务器端和客户端添加示例代码。完整的工作代码可在here 获得。连接成功后,每个客户端都会从 socket.io 服务器获取所有活跃的房间,并加入一个名为“ChessRoom”的房间

    服务器端

    const sockets = new Map() // holds all active sockets
    
    io.on('connection', (socket) => {
        console.log(`${socket.id}: connected`);
        sockets.set(socket.id,socket) // add socket to Map object
        socket.join("ChessRoom") // join socket to demo room
        
        socket.on('disconnect', (data)=>{
            console.log(`${socket.id} disconnected`);
            sockets.delete(socket.id) // delete socket from Map object
        })
    
        socket.on('getrooms', (data,replyFn)=>{
            console.log(`${socket.id}: received getrooms event with ${data}`);
            const rooms = Array.from(io.sockets.adapter.rooms).map( (room) => {
                return { name: room[0], members: Array.from(room[1])}
            })
            replyFn(rooms)
        })
    
    });
    

    客户端

    socket.on('connect', async ()=>{
        console.log(`${socket.id} connected`)
        const data = "OptionalData"
        socket.emit( "getrooms", data, (rooms) =>{
            rooms.forEach((room, index) => {
                console.log(`room${index}: `, room)    
            });       
        })
    })    
    
    socket.on('error', async ()=>{
        console.log(`${socket.id} error`)
    })    
    

    【讨论】:

    • 我不想显示我房间中可用的用户,而是显示我房间中可用的整个套接字服务器的玩家。我没有将用户分配给像“socket.user=myUser”这样的属性,而是将所有用户保存在一个“用户”数组中,如果他们的名字是正确的,他们的房间、名字和 id 属性。您可以在我提供的代码中看到它。我的主要问题是我不知道如何在客户端和服务器端对其进行编码。我知道如何在前端 hbs 车把中为其编码。感谢您的回答,但您能帮我解决这个问题吗?
    • 从技术上讲,您可以使用单独的数组进行用户 socket.id 映射,但我认为在登录期间处理此问题并使用新属性“user”来执行此操作更容易。 “我房间里的用户”=“我房间里的全套接字服务器可用玩家”? socket.io 中的“房间”只能以一种方式定义。你能澄清一下吗?
    • "稍后你可以查询所有加入你房间的套接字"-用户没有加入我的房间。相反,我想显示套接字服务器中的所有活动用户。并且用户在登录时无法访问套接字服务器。当他们点击“在线下棋”时,他们进入服务器并显示国际象棋游戏页面。另外,我已经将服务器活动用户保持在一个数组中,请查看我提供的代码。我只是问我如何在客户端发送用户数组并将其显示在在线玩家列表中。
    • 我只想发送这个用户数组“var users = [];”到客户端并在前端显示用户名。此外,如果任何用户断开在线用户列表也应该更新,我认为一旦我知道如何将数组发送到客户端就可以完成。
    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2016-01-16
    • 2014-03-06
    相关资源
    最近更新 更多