node.js - 我无法理解 websockets(通过 socket.io 和 node.js)

标签 node.js express websocket socket.io client-server

我是 websockets/socket.io/node.js 的新手。我正在尝试编写一个纸牌游戏应用程序,但我发现的几乎所有示例教程都在创建聊天应用程序。因此,我正在努力理解这些概念以及如何将它们应用到我的纸牌游戏中。

简单来说,纸牌游戏将涉及两名玩家。该游戏涉及在 table 上移动纸牌。每个玩家都必须看到其他玩家发生的 Action (因此需要持续的连接)。但对手的牌是对对方隐藏的。

因此,两个人浏览到同一张 table ,然后点击坐下(当两个座位都被占用时,就可以玩游戏)。使用

io.on("connection", function(sock){
      //socket events in here
});

我是创建客户端和服务器共享的一个套接字(“io”或“sock”?),还是两个单独的套接字(服务器/客户端A和服务器/客户端B)?我问,因为我很难理解消息发出和/或广播时发生的情况。如果客户端发出消息,该消息是同时发送到服务器和另一个客户端,还是仅发送到服务器?然后,它是否也向自己发送消息?似乎就是这个逻辑……或者“广播”方法的目的是什么?

从功能角度来看,我需要服务器向每个玩家发送不同的消息。所以它不像聊天室,服务器将聊天内容发送给每个人。但是,如果这是我们三个人共享的一个套接字(客户端和服务器),我如何管理谁看到什么?我读过有关命名空间的内容,但我正在努力弄清楚如何使用它。如果它是两个单独的套接字,那么我可以更容易地想象将不同的数据发送到单独的客户端。但它是如何实现的——是两个“io”对象,还是两个“sock”对象?

最后,我不知道这是否是这里接受的那种冗长的问题,所以如果不是,有人可以引导我到可以进行讨论的论坛吗?干杯!

(如果重要的话,我也使用 Expressjs 作为服务器)。

编辑添加: 我的部分困惑在于“io”和“sock”之间的区别。例如,来自 socket.io 页面的代码是应用于其中任何一个方法的一个很好的示例:

io.on('connection', function(socket){
  socket.emit('request', /* */); // emit an event to the socket
  io.emit('broadcast', /* */); // emit an event to all connected sockets
  socket.on('reply', function(){ /* */ }); // listen to the event
});

最佳答案

WebSocket 服务器端监听来自客户端的传入套接字连接。

每个客户端在连接时都会在他和服务器之间打开自己的套接字。服务器是跟踪所有客户端的服务器。

因此,一旦客户端发出服务器正在监听的消息,服务器就可以对该消息执行任何操作。消息本身可以包含有关谁是该消息的接收者的信息。

服务器可以根据您的客户端发送给您的信息或其他一些逻辑,将消息传递给每个人或将其广播给特定的用户。 对于纸牌游戏:

服务器监听传入连接。一旦两个客户端连接,他们都应该发出他们想要参与的游戏 ID。服务器可以在一个游戏(房间)中加入它们的套接字,并且这两个客户端之间的所有通信都可以在该房间中继续。每次客户端之一将数据传递到服务器时,该数据都应包含有关接收者的信息。

这里有一个简单的例子,也许可以帮助你: 客户端

// set-up a connection between the client and the server
var socket = io.connect();
// get some game identifier
var game = "thebestgameever";
socket.on('connect', function() {
 // Let server know which game you want to play
 socket.emit('game', game);
});
function makeAMove(move)
{
socket.emit('madeAMove', {move:move, game:game});
}

socket.on('move', function(data) {
  console.log('Player made a move', data);
 });

服务器端

io = socketio.listen(server);
 //listen for new connections from clients
 io.sockets.on('connection', function(socket) {
// if client joined game get his socket assigned to the game
socket.on('game', function(game) {
    socket.join(game);
});
socket.on('madeAMove', function(data){
  let game = data.game;
  let move = data.move;
  io.sockets.in(game).emit('move', move);
});
})

关于node.js - 我无法理解 websockets(通过 socket.io 和 node.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45936545/

相关文章:

javascript - 如何将参数传递给 Node A 库的 (nodeify) promise 处理程序

node.js - 如何使用 "Blank Node.js"模板在 Visual Studio 2019 中调试 React 应用程序

node.js - Socket.io 'Cannot connect' 。不同域/端口上的客户端

javascript - 如何在 package.json 中使用带有 npm 7.x.x 的变量?

node.js - 我的网络中的设备/计算机发现

node.js - 使用 makeAugmentedSchema 时必须提供 typeDefs

javascript - 从使用 Express 的 Node JS 服务器导出一个变量,以便我可以在客户端访问它?

node.js - 创建一个接受参数的 expressjs 中间件

javascript - 向其他人显示屏幕上的光标而不过多影响资源的最佳方式

python - 用Python编写基于浏览器的MMO服务器