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

时间:2017-08-29 10:18:50

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

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

保持简单,纸牌游戏将涉及两名球员。游戏涉及在桌子周围移动牌。每个玩家必须看到其他玩家的动作(因此需要不断的连接)。但对手的牌被隐藏在另一方。

所以两个人浏览到同一张桌子然后点击坐下(并且当两个座位都被拿走时播放)。使用

io.on("connection", function(sock){
      //socket events in here
});
我创建了一个客户端和服务器共享的套接字(' io'或' sock'?),或者是两个独立的套接字(服务器/客户端A和服务器) / clientB)?我问,因为我正在努力了解发送和/或广播消息时发生的事情。如果客户端发出消息,该消息是发送给服务器和其他客户端,还是仅发送到服务器?然后,它还会将消息发送给自己吗?好像这就是逻辑......或者广播的目的是什么?'方法?

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

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

(如果重要的是我也使用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
});

1 个答案:

答案 0 :(得分:1)

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

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

因此,一旦客户端发出消息服务器正在侦听,服务器就可以处理该消息。消息本身可以包含有关谁是该消息的接收者的信息。

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

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

这是一个可能让你前进的简单例子: 客户端

// 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);
});
})