2016-02-29 117 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

相关问题