套接字 io 不向房间发送消息

Posted

技术标签:

【中文标题】套接字 io 不向房间发送消息【英文标题】:socket io not emitting messages to rooms 【发布时间】:2021-08-30 12:03:09 【问题描述】:

我已经被这个问题困扰了一段时间了。当新客户端加入房间时,我想向房间的所有连接客户端发出。我已经看到https://socket.io/docs/v3/emit-cheatsheet/index.html 并尝试了所有房间的发射方法,如下面的服务器代码所示,除了发射到所有连接的客户端而不是特定房间的发射方法之外,它们都不起作用。

服务器代码

 socket.on("newUser", (data) => 

    socket.join(data.sessionId);

    //not a single one of these works to emit to a specific room
    socket.broadcast.to(data.sessionId).emit("userJoin", data);
    io.to(data.sessionId).emit("userJoin", data);
    io.in(data.sessionId).emit("userJoin", data);
    io.sockets.in(data.sessionId).emit("userJoin", data);

    //only this works but send to all the clients 
    io.emit("userJoin", data);
  );

客户端代码

        //simply adds a div with info to inform other users that a new user has joined
        //works only on io.emit() which emits to all the connected clients of every room

        socket.on("userJoin",(data)=>
            const users=document.getElementById('users');
            const noUsers=document.getElementById('noUsers');
            if(data.action==='join')
                const user = document.createElement('article');
                user.classList.add('card');
                user.classList.add('lobby-item');
                user.innerHTML=`<header class='card__header'>
                    <h1 class='session__id'>
                        $data.user.name
                    </h1>
                    </header>`;
              
                users.appendChild(user);
            
        );

我认为所有房间发射方法都不起作用的问题可能是房间形成错误或者是空的。但是房间的方法仍然没有在这里工作。

【问题讨论】:

socket.io和socket.io-client是什么版本。还建议首先使用客户端函数顶部的简单日志语句检查所有方法。也许广播有效,但功能没有运行 在我的应用程序中,用户加入,然后被重定向到另一个屏幕/路由。我认为在套接字 io 中是否存在重定向,或者即使客户端自己刷新页面然后他们当前套接字断开连接,并创建了一个具有新 socket.id 的新套接字,该套接字与前一个不同。所以基本上在重定向之后房间是空的并且 io.emit() 可以工作,因为它向所有人发射,无论它是新创建的套接字还是旧的。 【参考方案1】:

不要处理超过套接字事件名称并检查数据对象是否正确发送

例子

 io.to(data.sessionId).emit("userRoomJoin", data);
 io.emit("userJoin", data);

拆分套接字事件名称。

如果还是不行的话。

console.log(data.sessionId);

检查数据对象是否未定义。

【讨论】:

【参考方案2】:

当您在代码中使用对象时,请尝试检查它是否未定义!

所以试试这个命令:

console.log(data);

【讨论】:

亲手做的。它不是未定义的【参考方案3】:

在socket io中,如果有来自应用程序的重定向或来自客户端的刷新,则会创建一个新的socket.id,这意味着旧的socket已断开连接并创建了一个新的。

在我的应用程序中,我首先在加入路由上执行socket.emit(),然后将用户重定向到不同的大厅路由,这意味着加入房间的套接字由于重定向到大厅和新套接字而断开连接创建时不在任何房间内。

因此,io.to(data.sessionId).emit() 无法正常工作,因为加入房间的所有套接字都因重定向而断开连接。 io.emit() 在向当前连接的所有套接字发射时工作

【讨论】:

以上是关于套接字 io 不向房间发送消息的主要内容,如果未能解决你的问题,请参考以下文章

socket io 广播、房间和确认功能

socket io 广播、房间和确认功能

在Socket.IO 1.0中将消息发送到特定ID

向 Socket.io 中的其他房间发送消息

使用Socket.io将消息发送到多个房间?

Django Channels 不向 Android App 发送消息