Javascript 如何为多房间优化socket io代码结构
依赖项设置:Javascript 如何为多房间优化socket io代码结构,javascript,node.js,express,sockets,socket.io,Javascript,Node.js,Express,Sockets,Socket.io,依赖项设置: "axios": "^0.18.1", "express": "^4.17.1", "react": "^16.8.6", "react-dom": "^16.8.6", "react-scripts": "2.1.8", "socket.io": "^2.2.0", "socket.io-client": "^2.2.0" 我有一个react应用程序,可以与我的express js服务器对话。它使用套接字io进行实时客户端
"axios": "^0.18.1",
"express": "^4.17.1",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-scripts": "2.1.8",
"socket.io": "^2.2.0",
"socket.io-client": "^2.2.0"
我有一个react应用程序,可以与我的express js服务器对话。它使用套接字io进行实时客户端交互
在express for multi Room中构建代码的最佳方式是什么
目前我有多个客户端可以连接到不同的房间。最初在我的ExpressJS服务器中,我有全局变量,当多个客户端加入一个房间时,一切都正常工作
当然,问题是,当与其他客户有另一个房间时,我实际上是在他们之间共享全局变量。我知道这是一个问题(最初我主要是做PoC)。我有一些想法,但想知道是否有构建代码的最佳实践,以便在不同的房间中使用
例如,我的一个想法是存储一个大字典,在那里我有key=roomId,value=property包,其中包含我需要的所有变量
这应该行得通,但似乎不是最干净的方法
有什么想法吗
另外,将所有代码放在主连接代码中是否是最佳做法?
i、 e:
更具体的例子:
假设我有这个事件和这个全局变量,轮到谁来玩游戏
var playerTurnOrder = [];
var nextPlayer = 0;
socket.on("Pass", () => {
let room = getRoomForSocket(socket);
nextPlayer++;
io.to(socket.rooms[room]).emit("RefreshBoard", {
board: board,
pieceIntroduced: null,
nextPlayer: playerTurnOrder[nextPlayer % 4]
});
});
当有一个房间在游戏中时,上面的代码可以正常工作。
如果有两个房间(比如每个房间有4个客户)
我现在有一个问题,因为我正在共享playerTurnOrder变量和nextPlayer变量
这就是为什么我在想,也许我可以拥有一本字典(或者评论中建议的地图),其中key=room,value=more变量我想拥有。。
这应该行得通,但我们正在寻找那些在如何在NodeJ中构造socket io代码以及拥有多个房间(通道)方面有类似困难的人。您真的必须向我们展示您的代码,以便我们就如何做提出具体建议。你的话并不能真正描述你想做什么。另外,socket.io用户不“连接到房间”,因此部件会混淆。它们连接到服务器,可以连接零个或多个房间。关于如何在这里构造代码的问题实际上应该显示相关的代码。如果具有与房间关联的动态状态,则有多种方法可以保持该状态。请展示您的一些代码,这样我们就可以看到您试图跟踪的是什么,然后我们可以提出一些建议。我的一个想法是存储一个大字典,在那里我有key=roomId,value=property包,其中包含我需要的所有变量。这是一个很好的方法。使用
Map()
对象。感谢您的评论,我将展示一些代码。您真的必须向我们展示您的代码,以便我们就如何做提出具体建议。你的话并不能真正描述你想做什么。另外,socket.io用户不“连接到房间”,因此部件会混淆。它们连接到服务器,可以连接零个或多个房间。关于如何在这里构造代码的问题实际上应该显示相关的代码。如果具有与房间关联的动态状态,则有多种方法可以保持该状态。请展示您的一些代码,这样我们就可以看到您试图跟踪的是什么,然后我们可以提出一些建议。我的一个想法是存储一个大字典,在那里我有key=roomId,value=property包,其中包含我需要的所有变量。这是一个很好的方法。使用Map()
对象。感谢您的评论,我将展示一些代码
var playerTurnOrder = [];
var nextPlayer = 0;
socket.on("Pass", () => {
let room = getRoomForSocket(socket);
nextPlayer++;
io.to(socket.rooms[room]).emit("RefreshBoard", {
board: board,
pieceIntroduced: null,
nextPlayer: playerTurnOrder[nextPlayer % 4]
});
});