【问题标题】:Socket.IO only emits to one client but not the otherSocket.IO 只发送给一个客户端,而不是另一个
【发布时间】:2020-12-17 22:48:50
【问题描述】:

我制作了一个简单的多人文字游戏,其中包含一个服务器和两个客户端,其中字母块在中间翻转并显示给两个玩家。

我遇到了一个问题,即服务器只向一个客户端发出“翻转”动作而不向另一个客户端发出,即使我使用的是应该向所有人发出的 socket.emit 函数。几天来我一直在努力解决这个问题,我真的可以使用任何建议。

“翻转”动作的步骤如下。

  1. 一个客户端向服务器发出一个“翻转请求”。服务器收到“翻转请求”后会做两件事:(1) 开始倒计时,直到下一次翻转;(2) 向所有客户端发出“翻转请求”,以便他们知道倒计时已经开始。

  2. 服务器倒计时结束后,服务器向所有客户端发出“翻转”,然后所有客户端看到一个字母瓷砖被翻转。

现在的问题是:

  1. 服务器似乎只向其中一个客户端发送。这表现为只有一个客户可以看到翻转的瓷砖。
  2. 接收服务器消息的唯一客户端始终是连接到游戏的第二个客户端。也就是说,当服务器启动时,如果客户端 1 先连接,然后客户端 2 再连接,则无论谁提交翻转请求(客户端 1 或客户端 2),只有客户端 2 会看到任何图块。我觉得这很奇怪。

这是我的代码的简化版本(减去很多游戏机制,只是隔离了这个翻转动作)。代码下方还有游戏状态和控制台日志的图像。

client.js


// Emits "Flip Request" to the server when you press Enter
function keyhandler(e){
    var keyCode = e.keyCode;

    // enter key
    if (keyCode == 13){
         console.log('Requesting flip');
         socket.emit('flip_request', 0);
        }
}
window.addEventListener("keydown", function(e){keyhandler(e)}, false)

var socket = io();

socket.on('flip_request', function (){
    console.log('Received flip request');

    game.flip_status = 'Ready...';
});

socket.on('flip', function (current){
    console.log('Flipped');

    game.current = current;
    game.flip_status = 'Flipped!';
});

server.js

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);


http.listen(port, function(){
    console.log('listening on *:' + port);
});


io.on('connect', function(socket){
    
    var client_ip = socket.handshake.headers['x-real-ip'];
    
    console.log('Connected to ' + client_ip + '. ID: ' + socket.id)

    check_flip_take = function(){
        if (flip_waiting){
            if (new Date().getTime() > flip_time){
                console.log("Flip!")
                game.flip();
                flip_waiting = false;
                socket.emit('flip', game.current)
            }
        }
    }

    // Check for pending flips and takes
    setInterval(check_flip_take, 100);

    socket.on('disconnect', () => {
        console.log(`Player ${player_id} disconnected!`)
    });

    socket.on('flip_request', function(){
        console.log("Received flip request")
        flip_waiting = true;
        flip_time = new Date().getTime() + flip_delay; 
        socket.emit('flip_request');
    })
})

如果有用的话,这里是游戏状态的样子。如您所见,在客户端 1(左客户端)的控制台日志中,它反复显示“请求翻转”,此时客户端正在向服务器提交翻转请求。但只有右边的客户端(客户端 2)从服务器获取“翻转”事件。

【问题讨论】:

    标签: javascript sockets socket.io


    【解决方案1】:

    您的代码中有一个小问题:

    您需要使用io 发射而不是socket

    即:

    io.emit('flip_request')

    io.emit('flip', game.current)

    【讨论】:

    • 哦,是的,这就是问题所在。太感谢了!我没有意识到这是关键的区别。你真的为我节省了很多时间。
    【解决方案2】:

    socket.emit 仅将其发送到触发事件的套接字,您应该使用 io.emit 或者您可以使用 socket.join 在房间中加入套接字和

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 2016-10-19
      • 1970-01-01
      • 2017-08-07
      • 2020-07-21
      • 2021-01-05
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多