Socket.io 和 Nodejs:向多个客户端发送响应并且未保存更改(?)
Socket.io and Nodejs: Sending response to multiple clients and change not being saved(?)
编辑:我的第一个问题已经解决(相当简单)。第二个问题仍然有效,对于这个问题,我不知道如何解决这个问题。
我正在制作多人数独游戏。我是Nodejs和socket的新手,所以如果我的想法有误,请指正。
这是一项正在进行的工作,这是我目前正在尝试做的事情:当用户将值输入其中一个单元格时,它会使用该单元格的索引向服务器发出请求(?) .然后服务器从它拥有的答案 sheet 中找到正确的答案并将结果发送回客户端。然后 javascript 代码继续执行,如果输入正确,它将为所有用户输入该答案(注意:我假设用户现在正在输入正确答案;我会之后处理错误的答案部分).
问题:
1) 现在,正确答案将锁定在单元格中提交正确答案的人,但不会显示给所有客户。
2) 如果我向另一个单元格提交答案(无论正确与否),它将删除过去的更改 - 即用户之前输入并成为 "locked in"[=13= 的单元格]
这是我的 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]);
});
});
提前致谢!!!
在你的代码服务器中:
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.emit
更改为 io.sockets.emit
。这使得 socket.io
广播到所有连接的套接字。
正如 Sean Ryan 所提到的,socket.io 文档有一个关于不同房间的部分,如果您只想向连接到同一游戏的玩家广播:http://socket.io/docs/rooms-and-namespaces/
编辑:我的第一个问题已经解决(相当简单)。第二个问题仍然有效,对于这个问题,我不知道如何解决这个问题。
我正在制作多人数独游戏。我是Nodejs和socket的新手,所以如果我的想法有误,请指正。
这是一项正在进行的工作,这是我目前正在尝试做的事情:当用户将值输入其中一个单元格时,它会使用该单元格的索引向服务器发出请求(?) .然后服务器从它拥有的答案 sheet 中找到正确的答案并将结果发送回客户端。然后 javascript 代码继续执行,如果输入正确,它将为所有用户输入该答案(注意:我假设用户现在正在输入正确答案;我会之后处理错误的答案部分).
问题:
1) 现在,正确答案将锁定在单元格中提交正确答案的人,但不会显示给所有客户。
2) 如果我向另一个单元格提交答案(无论正确与否),它将删除过去的更改 - 即用户之前输入并成为 "locked in"[=13= 的单元格]
这是我的 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]);
});
});
提前致谢!!!
在你的代码服务器中:
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.emit
更改为 io.sockets.emit
。这使得 socket.io
广播到所有连接的套接字。
正如 Sean Ryan 所提到的,socket.io 文档有一个关于不同房间的部分,如果您只想向连接到同一游戏的玩家广播:http://socket.io/docs/rooms-and-namespaces/