node.js / socket.io:滞后和无法解释的断开连接

时间:2015-03-11 13:54:16

标签: node.js express websocket socket.io

我使用node.js和express建立了一个双人实时视频游戏。双向通信由socket.io处理。游戏只是太空侵略者的一个克隆,你左右移动一艘宇宙飞船射击敌人,没有任何图形或计算密集。

游戏在我的电脑上正常运行。当我在线测试时(在Heroku上),我主要遇到两个问题:

  • 游戏是滞后的(只是左右移动宇宙飞船几乎不可行)。我在Heroku内存限制之下并且我的应用程序的Web事务响应时间很好(平均不到7ms)。
  • 有时一个玩家没有明显的原因断开连接(在客户端,游戏只是冻结)。

这是我的第一个nodejs / socket.io项目,所以我不知道这些问题是否可以解决,或者是否是我们可以预期的技术问题,并且在这些技术的当前发展状态下难以解决。我还必须承认我仍在使用Express版本3.2.6和socket.io 0.9.6。是否有充分的理由认为我的问题可以通过升级解决(知道我在本地没有相同版本的问题)?

编辑:

在localhost上,我得到(好)socket.io日志:

debug - authorized
info  - handshake authorized h3KKs0td7dWUV-d7dVPW
debug - setting request GET /socket.io/1/websocket/h3KKs0td7dWUV-d7dVPW
debug - set heartbeat interval for client h3KKs0td7dWUV-d7dVPW
debug - client authorized for 
debug - websocket writing 1::
debug - emitting heartbeat for client h3KKs0td7dWUV-d7dVPW
debug - websocket writing 2::
debug - set heartbeat timeout for client h3KKs0td7dWUV-d7dVPW
debug - got heartbeat packet
debug - cleared heartbeat timeout for client h3KKs0td7dWUV-d7dVPW
debug - set heartbeat interval for client h3KKs0td7dWUV-d7dVPW

但这是我在Heroku上得到的:

2015-03-12T14:54:59.225532+00:00 app[web.1]: debug: authorized
2015-03-12T14:54:59.228461+00:00 heroku[router]: at=info method=GET path="/socket.io/1/?t=1426172098882" host=app.herokuapp.com request_id=bdb2d91f-3332-4b42-861a-373889e595c6 fwd="129.199.31.253" dyno=web.1 connect=0ms service=7ms status=200 bytes=209
2015-03-12T14:54:59.299001+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path="/socket.io/1/websocket/909762909928759556" host=app.herokuapp.com request_id=4609b498-cc7d-4f65-8a3c-244332150988 fwd="ip" dyno=web.1 connect=3ms service=5ms status=503 bytes=0
2015-03-12T14:54:59.228290+00:00 app[web.1]: info: handshake authorized 909762909928759556
2015-03-12T14:54:59.296245+00:00 app[web.1]: debug: setting request GET /socket.io/1/websocket/909762909928759556
2015-03-12T14:54:59.297418+00:00 app[web.1]: warn: websocket connection invalid
2015-03-12T14:54:59.297983+00:00 app[web.1]: debug: set close timeout for client 909762909928759556
2015-03-12T14:54:59.298944+00:00 app[web.1]: debug: cleared heartbeat interval for client 909762909928759556
2015-03-12T14:54:59.406210+00:00 app[web.1]: debug: set heartbeat interval for client 909762909928759556
2015-03-12T14:54:59.407576+00:00 app[web.1]: debug: cleared close timeout for client 909762909928759556
2015-03-12T14:54:59.296644+00:00 app[web.1]: debug: set heartbeat interval for client 909762909928759556
2015-03-12T14:54:59.297579+00:00 app[web.1]: info: transport end (undefined)
2015-03-12T14:54:59.298643+00:00 app[web.1]: debug: cleared close timeout for client 909762909928759556
2015-03-12T14:54:59.405871+00:00 app[web.1]: debug: setting request GET /socket.io/1/websocket/909762909928759556
2015-03-12T14:54:59.406676+00:00 app[web.1]: warn: websocket connection invalid
2015-03-12T14:54:59.406788+00:00 app[web.1]: info: transport end (undefined)
2015-03-12T14:54:59.407212+00:00 app[web.1]: debug: set close timeout for client 909762909928759556
2015-03-12T14:54:59.407731+00:00 app[web.1]: debug: cleared heartbeat interval for client 909762909928759556
2015-03-12T14:54:59.407046+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path="/socket.io/1/websocket/909762909928759556" host=app.herokuapp.com request_id=75d2c5e5-eac3-4ec0-8774-640892993a6e fwd="ip" dyno=web.1 connect=0ms service=3ms status=503 bytes=0
2015-03-12T14:55:09.394154+00:00 app[web.1]: debug: setting request GET /socket.io/1/xhr-polling/909762909928759556?t=1426172109066
2015-03-12T14:55:09.395831+00:00 app[web.1]: debug: client authorized for 
2015-03-12T14:55:09.397405+00:00 app[web.1]: debug: xhr-polling writing 1::
2015-03-12T14:55:09.458911+00:00 app[web.1]: debug: setting request GET /socket.io/1/xhr-polling/909762909928759556?t=1426172109122
2015-03-12T14:55:09.459657+00:00 app[web.1]: debug: discarding transport
2015-03-12T14:55:09.491409+00:00 app[web.1]: debug: xhr-polling received data packet �41�5:::{"name":"player","args":["aaa"]}�25�5:::{"name":"update"}
2015-03-12T14:55:09.394628+00:00 app[web.1]: debug: setting poll timeout
2015-03-12T14:55:09.396896+00:00 app[web.1]: debug: clearing poll timeout
2015-03-12T14:55:09.397721+00:00 app[web.1]: debug: set close timeout for client 909762909928759556
2015-03-12T14:55:09.459456+00:00 app[web.1]: debug: setting poll timeout
2015-03-12T14:55:09.459867+00:00 app[web.1]: debug: cleared close timeout for client 909762909928759556

由于我没有太多时间来修复与版本相关的问题,我宁愿探索不需要升级的解决方案,除非你告诉我好处会很好。

PS:我很乐意提供一些代码,但我不知道哪些代码对我的问题很重要。

1 个答案:

答案 0 :(得分:0)

我的问题是,在工作中,我的互联网连接通过代理,可能不接受websockets。然后Socket.io恢复为xhr-polling进行通信。

从工作以外的地方进行测试没有任何问题。

您可以使用http://www.lagado.com/proxy-test等网站来测试您是否通过代理连接到互联网。