我正在开发一个小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按钮,显示左侧第一次点击开始的战斗,以及用户在右侧受到挑战的警报)
提前感谢您的帮助!
答案 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,并仅在挑战时专门向它们发出。这会减少您的服务器调用。