2017-08-29 29 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