2016-02-29 121 views
2

編輯:我的第一個問題已經解決(相當簡單)。第二個問題仍然有效,對於這個問題,我不知道如何解決問題。Socket.io和Nodejs:向多個客戶端發送響應並更改未保存(?)

我正在製作多人數獨遊戲。我是Nodejs和套接字的新手,如果我的思路錯誤,請糾正我的錯誤。

這是一個正在進行的工作,這裏是我現在要做的:當用戶向其中一個單元格輸入值時,它會使用該單元格的索引向服務器發出請求(?)。然後服務器從它的答題卡中找到正確的答案,並將結果發送回客戶端。然後,javascript代碼會一直如此,如果輸入的是正確的輸入,它會將所有用戶的答案都寫入(注意:我假設用戶正在輸入正確的答案;之後我將處理錯誤的答案部分 )。

的問題:

1)眼下,正確答案將鎖定在誰在小區提交正確答案的人,但它不會顯示所有的客戶。

2)如果我提交的答案,另一個單元格(無論正確與否),它會刪除過去的變化 - 也就是說,用戶預先輸入併成爲「鎖定」

這裏是小區我的javascript代碼:

function closeCellInput($cell) { 
    var index  = $boardCells.index($cell); 
    // var target = findTarget(index); //SHOULD BE SERVER 
    socket.emit('target', index); 
    socket.on('targetResult', function(data){ 
     console.log('data: ' + data); 
     var target = data; 
     var number = $cell.find('input').val(); 
     var complete = false; 

     $cell.empty().removeClass('empty').removeClass('solved').attr('style', null); 
     socket.emit('index', index); 

     if (number == target) { 
      $cell.text(number).addClass('solved'); 
      complete = true; 
      socket.emit('solved', number); 

      //complete = checkComplete(); 
     } 
     else if (number != '') { 
      var cell  = $cell[0]; 
      var animator = new Animator({duration:750}); 
      var animation = new ColorStyleSubject(cell, "background-color", "#FF8888", "#FFFFFF"); 

      $cell.text('').addClass('empty'); 
      animator.addSubject(animation).play(); 
      //$cell.html('<input type="text"/>').find('input').focus(); 
      //adding above line does not make the red light blinkerino 
     } 
     else { 
      $cell.text('').addClass('empty'); 
     } 

     $selected = $([]); 
    }); 




} 

這裏是我的相關服務器的代碼(如果需要):

io.on('connection', function(socket){ 
    console.log('a user connected'); 

    socket.on('disconnect', function(){ 
     console.log('user disconnected'); 
    }); 

    socket.on('solved', function(val){ 
     console.log('number value: ' + val) 
    }); 

    socket.on('target', function(index){ 
     //Hard coded answers for now, but will be changed later 
     var solution = "435269781682571493197834562826195347374682915951743628519326874248957136763418259"; 

     console.log('index: ' + solution[index]); 
     socket.emit('targetResult', solution[index]); 

    }); 

});

在此先感謝!

+1

它不會出現,你是任何廣播事件發送給服務器代碼中的所有客戶端。你有沒有忽略這個部分?可能的解釋#1 編輯:爲了澄清,似乎你的來自服務器的「響應」事件只發射到發起它們的客戶端。 –

+1

我以爲是這樣。我該如何去向所有客戶播放活動?我是Node和Socket的新手,所以我不太確定如何做到這一點。 編輯:我解決了廣播問題(而不是簡單地實際上哈哈)。 – FudgeNouget

+1

要*所有*客戶,或只在特定的*房間*?以下是相關文檔的相關部分。 HTTP://插座。io/docs/rooms-and-namespaces/ 或者,最簡單的說,'io.sockets.emit()' –

回答

2

在你的代碼服務器:

socket.on('target', function(index){ 
    //Hard coded answers for now, but will be changed later 
    var solution = "435269781682571493197834562826195347374682915951743628519326874248957136763418259"; 

    console.log('index: ' + solution[index]); 
    socket.emit('targetResult', solution[index]); 

}); 

你只發射到發件人連接到的插座。爲了散發給大家,請使用以下語法:

socket.on('target', function(index){ 
    //Hard coded answers for now, but will be changed later 
    var solution = "435269781682571493197834562826195347374682915951743628519326874248957136763418259"; 

    console.log('index: ' + solution[index]); 
    io.sockets.emit('targetResult', solution[index]); 

}); 

注意,我改變socket.emitio.sockets.emit。這使得socket.io廣播到所有連接的套接字。

正如肖恩·瑞恩提到的,socket.io文檔有一個關於不同的房間部分,如果你要廣播只連接到同一個遊戲玩家:http://socket.io/docs/rooms-and-namespaces/

+1

謝謝!我會繼續研究它,看看我能否按照我希望的方式進行工作。而且,我確實計劃擁有多個房間(儘管這更像是「在我能夠首先得到這個工作之後」)。 我仍然試圖找出JavaScript的問題哈哈。我想我有想法。希望他們是好的! – FudgeNouget

+0

那麼它是否適用於'io.sockets.emit'? 一旦準備就緒,發送一個鏈接到您的遊戲。可能很有趣! :-) – Thatkookooguy

相關問題