javascript - Socket.io 和 Nodejs : Sending response to multiple clients and change not being saved(? )

标签 javascript node.js sockets server client-server

编辑:我的第一个问题已经解决(相当简单)。第二个问题仍然有效,对于这个问题,我不知道如何解决该问题。

我正在制作一款多人数独游戏。我是Nodejs和socket的新手,所以如果我的想法有误,请纠正我。

这是一项正在进行的工作,这就是我目前正在尝试做的事情:当用户在其中一个单元格中输入一个值时,它会使用该单元格的索引向服务器发出一个请求(?)。然后,服务器从其拥有的答卷中找到正确答案,并将结果发送回客户端。然后 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]);

    });

});

提前致谢!!!

最佳答案

在您的代码服务器中:

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/

关于javascript - Socket.io 和 Nodejs : Sending response to multiple clients and change not being saved(? ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35704034/

相关文章:

javascript - 获取 `url` 的访问被 CORS 策略 : No 'Access-Control-Allow-Origin' header is present on the requested resource. ReactJS 阻止

javascript - 是否可以使用 axios-mock-adapter 将部分数据与 onPost() 匹配?

node.js - 在 Node.js gRPC 客户端中获取 `Error: 8 RESOURCE_EXHAUSTED: Received message larger than max (15217288 vs. 4194304)`

javascript - 显然 JSON.parse 比声明对象字面量更快。如果是这样的话,为什么我的结果显示不一样?

C++ 套接字连接问题

javascript - 如何在angularjs中进行表格格式化?

javascript - 状态码为 200 的 Get() 捕获异常

node.js - 对 mongodb 批量 API 实现限制

c++ - 套接字缓冲区到字符串

java - JODConverter问题