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

I can't get my head around websockets (via socket.io and node.js)

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

为简单起见,纸牌游戏将涉及两名玩家。该游戏涉及在 table 周围移动纸牌。每个玩家都必须看到其他玩家的动作(因此需要持续连接)。但是对方的牌对对方是隐蔽的

所以两个人浏览到同一个 table 然后点击坐下(当两个座位都被占用时开始游戏)。使用

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

我是在创建客户端和服务器共享的一个套接字('io',还是 'sock'?),还是两个单独的套接字(server/clientA 和 sever/clientB)?我问,因为我很难理解发出消息时发生了什么 and/or 广播。如果客户端发出一条消息,该消息是同时发送到服务器和其他客户端,还是只发送到服务器?然后,它还会向自己发送消息吗?似乎这就是逻辑......或者 'broadcast' 方法的目的是什么?

从功能的角度来看,我需要服务器向每个玩家发送不同的消息。所以它不像聊天室,服务器将聊天内容发送给每个人。但如果它是我们三个人(客户端和服务器)共享的一个套接字,我该如何管理谁能看到什么?我读过有关名称空间的信息,但我正在努力弄清楚如何使用它。如果它是两个独立的套接字,那么我可以更轻松地想象向不同的客户端发送不同的数据。但它是如何实现的——是两个 '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);
});
})