【问题标题】:Socket.io emits to non-existing roomSocket.io 发射到不存在的房间
【发布时间】:2013-08-01 16:41:41
【问题描述】:

我正在编写游戏并使用 socket.io。游戏中的每张地图都由 socket.io 中的一个房间表示。

它是这样工作的。用户运行客户端并加入主房间(大厅),这是 socket.io 中的一个空房间“”,从那里,用户可以创建一个房间,roomId 是数字,从 0 开始(0、1、2、3 等) .当用户加入一个房间时,它会启动一个计时器 - 倒计时直到当前地图结束。

 __startTimer:function()
{
    this.__timerId=setInterval(this.__onTimerTick.bind(this), 1000);
},

__onTimerTick:function()
{
    var string="Timer event in room "+this.__roomId+", list of socket.io rooms:";
    console.log(string);
    console.log(g.socketIo.sockets.manager.rooms);

    this.__duration--;
    g.socketIo.sockets.in(this.__roomId).emit(g.messages.FIGHT_TIMER_TICK_EVENT, {time: this.__duration});
    if(this.__duration==0)
    {
        clearInterval(this.__timerId);
        this.__fightEnd();
    }
},

问题是,当用户关闭他的客户端时,他会离开房间,如果房间里没有更多用户,它就会被销毁。但是当用户再次运行客户端,加入大厅时,socket.io 开始向大厅发送计时器事件。所以它发射到错误的房间。

日志:

info: socket.io started
debug: client authorized
info: handshake authorized iFE6tqsa_lThtxv8wsoi
debug: setting request GET /socket.io/1/flashsocket/iFE6tqsa_lThtxv8wsoi
debug: set heartbeat interval for client iFE6tqsa_lThtxv8wsoi
debug: client authorized for 

Timer event in room 0, list of socket.io rooms:
{ '': [ 'iFE6tqsa_lThtxv8wsoi' ],
  '/0': [ 'iFE6tqsa_lThtxv8wsoi' ] }
debug: flashsocket writing 5:::{"name":"104","args":[{"time":179}]}
Timer event in room 0, list of socket.io rooms:
{ '': [ 'iFE6tqsa_lThtxv8wsoi' ],
  '/0': [ 'iFE6tqsa_lThtxv8wsoi' ] }
debug: flashsocket writing 5:::{"name":"104","args":[{"time":178}]}
Timer event in room 0, list of socket.io rooms:
{ '': [ 'iFE6tqsa_lThtxv8wsoi' ],
  '/0': [ 'iFE6tqsa_lThtxv8wsoi' ] }
debug: flashsocket writing 5:::{"name":"104","args":[{"time":177}]}

info: transport end (socket end)
debug: set close timeout for client iFE6tqsa_lThtxv8wsoi
debug: cleared close timeout for client iFE6tqsa_lThtxv8wsoi
debug: cleared heartbeat interval for client iFE6tqsa_lThtxv8wsoi
debug: discarding transport

Timer event in room 0, list of socket.io rooms:
{}
Timer event in room 0, list of socket.io rooms:
{}
Timer event in room 0, list of socket.io rooms:
{}
Timer event in room 0, list of socket.io rooms:
{}

debug: client authorized
info: handshake authorized z540AkrvWAb5X4Lzwsoj
debug: setting request GET /socket.io/1/flashsocket/z540AkrvWAb5X4Lzwsoj
debug: set heartbeat interval for client z540AkrvWAb5X4Lzwsoj
debug: client authorized for 

Timer event in room 0, list of socket.io rooms:
{ '': [ 'z540AkrvWAb5X4Lzwsoj' ] }
debug: flashsocket writing 5:::{"name":"104","args":[{"time":158}]}
Timer event in room 0, list of socket.io rooms:
{ '': [ 'z540AkrvWAb5X4Lzwsoj' ] }

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    实际上,这是一个错误(?),您不能使用“数字”作为房间 ID。只有字符串。

    【讨论】:

    • 好吧,这很有趣。我不知道这一点,我使用整数作为房间 ID。它工作得很好,除了从服务器传输到房间 0 的任何消息都被广播到所有房间。 不是以任何方式的预期行为!我会考虑使用字符串而不是整数以及这对我有什么作用。
    • 用十六进制编码整数并将它们用作字符串到目前为止有效!感谢您提出这个答案!
    【解决方案2】:

    我认为问题在于:“从 0 开始”。不要使用 0 作为房间名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 2016-12-21
      • 2013-07-12
      • 1970-01-01
      • 2016-09-04
      • 2017-12-23
      • 1970-01-01
      相关资源
      最近更新 更多