如何使用socket.io将所有客户端重定向到另一个页面?

时间:2019-06-19 16:17:06

标签: node.js reactjs socket.io

我正在开发针对人类游戏的在线多人纸牌游戏(在正面进行响应,用于重定向的React路由器,在背面进行Node),当一个用户尝试在“大厅”或房间中重定向所有客户端时,在大厅中单击“开始”,但现在仅重定向单击开始的用户。

这个想法是,有人将建立一个新游戏,该游戏将具有一个唯一的图钉,在您创建游戏并选择头像后,其他人可以使用该图钉加入大厅(这部分工作正常,用户大厅中的所有用户均会实时更新),并且只有创建游戏的人才能在所有用户加入后获得“开始”按钮以单击以启动游戏,这将重定向大厅中的所有用户。

在客户端,在Lobby组件的构造函数中,我有

   socket.on("start game", () => {
      this.props.history.push(`/${this.props.match.params.pin}`);
    });

对于有权访问“开始”按钮的一个用户,单击它会触发以下内容

socket.emit("start");

然后去后端

   socket.on('start', () => { 
        socket.emit('start game');
    })

但是只有单击开始的用户才被重定向,我似乎无法弄清楚。

这是我第一次尝试实现套接字,但我不确定我在这里可能缺少什么

3 个答案:

答案 0 :(得分:2)

服务器需要使用您应该重定向到的URL向要重定向的每个用户发送一个socket.io消息。每个客户端都应该有一个用于该socket.io消息的侦听器,并在获得消息时,将window.location设置为该新URL来引起重定向。

因此,服务器会将这样的内容发送给每个应该重定向的客户端:

socket.emit('redirectToNewGame', newGameURL);

其中socket是应该重定向的每个用户的套接字。

然后,每个客户端将具有如下代码:

socket.on('redirectToNewGame', newGameURL => {
    // redirect to new URL
    window.location = newGameURL;
});

如果整个过程是由用户单击自己窗口中的按钮启动的,则该用户向服务器发送一条消息以启动整个过程。服务器收到该消息后,会通过向每个客户端发送一个socket.io消息来通知应遵循该重定向的特定客户端集。

您的服务器如何准确地跟踪应该将哪些客户端重定向到该URL,这取决于您的设计。在socket.io的服务器端,通常使用空间来实现,但是也可以用您自己的代码来完成。这只是您应用程序设计的一部分,也是用户在整个过程之前进行会合的一部分。

答案 1 :(得分:2)

剩下要做的就是将该事件广播到给定namespace or room中的所有套接字。当前,您仅将其发送到发出“开始”事件的套接字。这是一种实现方法:

客户端

const socket = io("lobby", { //Connecting to a namespace called "lobby"
    transports: ["websocket"]
});
socket.on("start game", () => {
    this.props.history.push(`/${this.props.match.params.pin}`);
});

//...
socket.emit("start");

服务器端:

io.of("/lobby").on("connection", (socket) => {
    socket.on("start", () => {
        io.of("/lobby").emit("start game");
    });
});

答案 2 :(得分:1)

一些回答的人建议我使用名称空间,这很有意义,而且有效。

io.in(pin).emit("start game");

而不是简单地

       socket.emit('start game');

让它正常工作