当前位置: 首页 > 知识库问答 >
问题:

套接字IO和动态室

越伟泽
2023-03-14

如果有人对WebSocket/Socket IO有经验,希望你能给我指出正确的方向。

我制作了一个不和谐的克隆,我正试图优化它以更好地扩展。现在,当一个用户发送一条消息时,我向数据库查询该服务器的所有用户部分,并向他们的特定套接字发送一条消息。这显然不能很好地扩展,因为每条消息都需要在客户机列表中进行昂贵的查询和查找

// Emit messages to only users part of specific server
    // Will only return list of users part of server and active in last 10 minutes
    sqlQuery = `SELECT userservers.user_id FROM userservers 
                  JOIN users ON users.user_id = userservers.user_id AND users.user_last_active > (NOW() - INTERVAL 10 minute)
                  WHERE server_id = ${sql.escape(serverId)}`;
    const users = await sql.query(sqlQuery);
    action = { type: "message", payload: msg };

    // Iterate over users, and find them in clients list
    // Emit over socket only to that user
    users.forEach((user) => {
      clients.forEach((client) => {
        if (client.userId === user.user_id) {
          io.to(client.id).emit(user.user_id, action);
        }
      })
    });

然而,为每台服务器使用房间将消除我查询数据库的需要。我知道我可以在套接字服务器首次启动时执行此操作

// Get server list from Mysql DB
servers.forEach((server) => {
    socket.join(server.name);
}

但是,我的问题是,当用户在应用程序运行后创建新服务器时,它不会更新列表。

我可能缺少一些关于创建动态房间的概念。

编辑:我想解决方案可能是每次创建“服务器”时,我都会向套接字服务器发送一条消息,这样它就可以加入那个“房间”

共有1个答案

佴涵蓄
2023-03-14

现在,当一个用户发送一条消息时,我向数据库查询该服务器的所有用户

我认为您可以向所有在线用户提交广播消息,而不是每个客户端的forEach=

我也想知道你为什么要创建许多服务器?您可以通过使用const命名空间=io.of('/thisIsADetateNamespace')将服务器划分为命名空间;并且您还可以通过namespace.emit向此名称空间中的所有用户提交广播消息('某些事件',{for:'名称空间中的每个人' });

所以你的聊天结构可以是这样的

服务器

  • 命名空间//用于单独的聊天应用/或类似于松弛的工作空间
  • 房间//小组聊天
  • ClientID//为一对一

 类似资料:
  • 问题内容: 调用一次后如何重新连接到套接字io ? 这是代码 如果我这样做,它会起作用。如果我这样做,它将断开连接。但是,如果我尝试使用重新连接,则连接不再起作用。我如何才能建立连接? 问题答案: 好吧,您可以在这里选择… 首次初始化套接字值时,应使用, 下次(调用一次断开连接后),您应使用再次连接。 所以你的应该是这样的

  • 我在使用https域和https套接字io时收到此警告。 我的代码是这样的: 希望有答案来解决这个问题。我已经从其他人那里搜索过,但我申请时发现不起作用。

  • 5个脚本(type='text/javascript'6var socket=io.connect();7个socket.on('makeAlert',function(){ Ty感谢你的帮助

  • 问题内容: 如何验证socket.io连接?我的应用程序使用来自另一台服务器(python)的登录端点来获取令牌,每当用户在节点侧打开套接字连接时如何使用该令牌? 和客户端: 如果令牌是在python中创建的: 如何使用此令牌对节点中的套接字连接进行身份验证? 问题答案: 令牌是否在另一台服务器上创建都没有关系。如果您拥有正确的密钥和算法,您仍然可以验证它。 用模块实施 客户 服务器 用模块实施

  • 我尝试用laravel echo服务器和套接字创建实时应用程序。io,但客户端未成为消息 这是我的代码: .环境 配置/queue.php config/database.php 路线/频道。php src/echo。js 活动/MessagePosted.php 消息控制器。php 在Redis cli PING命令return PONG中安装了Redis服务器。我使用php artisan q

  • 我正在Windows Server 2008 R2上运行一个使用IIS 7.5的小网站。我有一个节点。js应用程序也在3000端口上运行。 来自网站(客户端浏览器)的Http调用从至。到目前为止一切正常。 问题是当我尝试使用套接字时。伊奥。 我正在接收: 如果我没有猜错的话,我很肯定: 它确实会将初始请求转发到我的服务器,因为对websocket服务器的初始请求是一个标准HTTP请求(带有一些附加