我正在开发针对人类游戏的在线多人纸牌游戏(在正面进行响应,用于重定向的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');
})
但是只有单击开始的用户才被重定向,我似乎无法弄清楚。
这是我第一次尝试实现套接字,但我不确定我在这里可能缺少什么
答案 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');
让它正常工作