【问题标题】:socket.io not listening to global eventsocket.io 没有监听全局事件
【发布时间】:2019-02-07 16:46:17
【问题描述】:

我正在研究 Socket.io 文档,但仍然无法弄清楚为什么 io.sockets.on 不起作用。我试过使用io.on,但没有成功。

在客户端,我只是监听socket.on(ROUND_START/ROUND_END)的事件

这个客户端监听器正在工作,但是,服务器之一 - io.sockets.on(ROUND_START... - 没有。

服务器

/**
 * Handle  Game phases
 */
const NEXT_GAME_TIMEOUT = 5000;
const END_GAME_TIMEOUT = 10000;
const FULL_GAME_TIMEOUT = END_GAME_TIMEOUT + NEXT_GAME_TIMEOUT;
const ROUND_START = "ROUND_START";
const ROUND_END = "ROUND_END";

setInterval(() => {
  io.sockets.emit(ROUND_START);
}, FULL_GAME_TIMEOUT);

// Not working
io.sockets.on(ROUND_START, () => {
  console.log("ROUND STARTED")

  setTimeout(() => {
    io.sockets.emit(ROUND_END);
  }, END_GAME_TIMEOUT)
});

io.sockets.on(ROUND_END, () => {
  console.log("ROUND ENDED")

  setTimeout(() => {
    io.sockets.emit(ROUND_START);
  }, NEXT_GAME_TIMEOUT)
});

不从客户端发送与回合开始相关的任何内容的想法是因为回合必须跨套接字同步。

我做错了什么?

【问题讨论】:

  • 嘿,我想我误解了你的问题。如果我理解正确,您想捕获从服务器发送到服务器上客户端的事件。您可能想要查看节点事件发射器,然后从该事件将更新发送到客户端。此人可能会解决您的问题stackoverflow.com/questions/26667378/…

标签: javascript sockets socket.io sails.js


【解决方案1】:

我通常在套接字连接到服务器时附加。我在https://socket.io/get-started/chat

得到了这个聊天示例

完整的服务器配置

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

app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
});

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

const NEXT_GAME_TIMEOUT = 5000;
const END_GAME_TIMEOUT = 10000;
const FULL_GAME_TIMEOUT = END_GAME_TIMEOUT + NEXT_GAME_TIMEOUT;
const ROUND_START = "ROUND_START";
const ROUND_END = "ROUND_END";

io.on('connection', function(socket) {
    console.log("user connected!!!");
    socket.on(ROUND_START, () => {
        console.log("ROUND STARTED")

        setTimeout(() => {
        io.sockets.emit(ROUND_END);
        }, END_GAME_TIMEOUT)
    });

    socket.on(ROUND_END, () => {
        console.log("ROUND ENDED")

        setTimeout(() => {
        io.sockets.emit(ROUND_START);
        }, NEXT_GAME_TIMEOUT)
    });
})

【讨论】:

  • 感谢您的回答。我可能遗漏了一些东西,但是这个例子的问题在于,一旦新一轮开始的次数与连接次数一样多,它就会向事件队列添加一个新的超时。 2 个不同的套接字将发出全局 ROUND_START。这意味着超时数量将随着每一轮的开始和结束呈指数增长。
  • 确实如此,但在您的示例中也是如此。您的客户可能不应该控制这些信息。我对您的游戏了解得不够多,无法就如何实现它做出最终决定,但也许这些信息应该由服务器控制。如果回合因任何原因提前结束,则客户端可以发送该信息。我试图解决您示例中的代码问题,如果没有更多信息,我无法解决逻辑流程问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2021-10-17
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多