两个目标套接字之间的[Node.JS Socket.io]通信

时间:2015-05-12 14:56:35

标签: node.js socket.io

我正在开发一个小node.js游戏。 游戏应该有一个全球聊天,有一个“登录”列表来挑战人们。

对于聊天和登录列表,我使用的是默认的socket.io room / namespace。

我使用以下代码成功发送质询请求

// When a user sends a battle challenge
socket.on("sendChallenge", function(data) {
    // Try with room
    socket.join('battleRoom');

    var data= {
        "userID": data.targetID,
        "challengerName": data.challengerName
    };
    console.log(data.challengerName + " challenged " + data.userID);
    // broadcast the message, but only the concerned player will answer thanks to his ID
    socket.broadcast.emit('receiveChallenge', data);
});

客户端,然后我有这个代码:

socket.on('receiveChallenge', function (data) {
        if (data.userID == userID) {
            alert("received challenge from " + data.challengerName);
            socket.emit('ack');
        }
});

正确的玩家确实会收到警报,并将“确认”发送到服务器:

socket.on('ack', function() {
    socket.join('battleRoom');
    socket.to('battleRoom').broadcast.emit('receiveMessage', 'SYSTEM: Battle begun');
    //socket.to('battleRoom').emit('receiveMessage', 'SYSTEM: Battle begun');
})

除了“socket.to('battleRoom')。broadcast.emit('receiveMessage','SYSTEM:Battle started');”只有挑战者才能接受,而不是被挑战者接受,我被困住了。 (第二行被评论,因为挑战者收到了2条消息,并且没有收到任何挑战)

我理解它的方式,在服务器上,函数socket.on()将“socket”作为发送消息的客户端,然后使用广播发送给所有其他人。 为什么在sendChallenge事件中,我有socket.join('battleRoom')让挑战者进入battleRoom。 然后我播出挑战,并要求客户承认挑战。 在ack中,客户端也应该加入battleRoom。

但我显然做错了什么,我似乎无法看到...... 我希望挑战者和挑战者通过服务器进行沟通。

指向或多或少显示情况的图片链接:Here (屏幕是我第二次点击quickFight按钮,显示左侧第一次点击开始的战斗,以及用户在右侧受到挑战的警报)

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

根据socket.io documentation广播执行以下操作:

  

广播消息   要进行广播,只需添加广播标志即可发出和发送方法调用。广播意味着向除了启动它的套接字以外的所有人发送消息。

所以当你这样做时:

$(document).ready(function(){
   if (typeof (jsondata[0]) == 'undefined') {
      $('#unassignedDevices').hide();
    }
});

您不会向广播到房间的插座发射。只需用以下内容替换该行:

socket.to('battleRoom').broadcast.emit('receiveMessage', 'SYSTEM: Battle begun');

这假设你命名了你的socket.io对象io,如果你用不同的名字命名它。

正如旁注所示,如果您创建一个包含所有已连接套接字ID(或套接字本身)的关联数组,则此处无需向所有人广播您的原始消息。然后,您可以在阵列中找到受挑战的套接字ID,并仅在挑战时专门向它们发出。这会减少您的服务器调用。