2017-08-29 31 views
1

我是websockets/socket.io/node.js的新手。我正在尝试编写一款纸牌游戏应用程序,但几乎所有我找到的示例教程都创建了聊天应用程序。所以我正在努力让自己的头脑对这些概念感兴趣,以及如何将它们应用到我的纸牌游戏中。我无法绕过websockets(通过socket.io和node.js)

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

因此,两个人浏览到同一张桌子,然后点击坐下(并且在两个座位被拿走时玩)。使用

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

我在创建一个套接字(“IO”,或“袜子”?),这两个客户端和服务器共享,或者是两个独立的插座(服务器/客户端A和服务器/ clientB)?我问,因为我很难理解发送和/或广播消息时发生了什么。如果客户端发出消息,那么该消息是发送给服务器还是其他客户端,还是仅仅发送给服务器?然后,它还会将信息发送给自己吗?似乎这就是逻辑......或“广播”方法的目的是什么?

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

最后,我不知道这是否是在这里被接受的那种冗长的问题,所以如果不是这样,那么有人可以指引我参加讨论可以发生的论坛吗?干杯!

(万一它很重要我也使用Expressjs作为服务器)。

编辑补充: 我的困惑的一部分是关于'io'和'袜子'之间的区别。此代码例如,从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 
}); 
+0

我可以建议你分割你的问题分成一套小的问题。然后继续前进。 – Lazyexpert

+0

步骤很好。这是摆脱我的整体大局。我不明白当涉及多方的'连接'发生时究竟发生了什么。我会自己测试一下,但我不确定这是否会从同一个客户端(但不同的浏览器)工作,是吗? – erv

+0

连接这个'sock' - 是用户和服务器之间的套接字对象。你可以玩它来达到你的结果。也看看房间。 – Lazyexpert

回答

1

WebSocket的服务器端监听来自客户端的socket连接。

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

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

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

服务器侦听传入连接。一旦连接了两个客户端,他们都应该发布他们想要参与的游戏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); 
}); 
}) 
+0

谢谢你。给我一点时间来吸收。与此同时,'.join'是'房间'不是吗?但是,我需要使用房间吗?我猜测必须有必要分离出服务器上运行的每个游戏桌面吗?最后,客户只能与服务器通话,而不是彼此,对吗?而'.emit',那么这个发射器是不是会陷入对它自己的消息的无限循环中?基本上这就是我对“发射”和“广播”之间差异的问题。 – erv

+0

发送消息给正在收听的每个人。添加广播意味着服务器向正在收听的所有人发送消息,不包括发送消息的一个套接字。所以你可以使用io.sockets.in(游戏).emit('move',move)向游戏中的每个人发送消息(包括首先发送消息的套接字)或socket.broadcast.to(游戏)。发出('移动',移动)并将消息发送到所有套接字,不包括发送消息的套接字。使用广播作为阻止套接字接收它发送的消息的一种方式。 – Jovana

+0

是的,房间将是分离游戏桌的一种便捷方式,此外,您还有机会在一天内制作多人游戏。 – Jovana