node.js / socket.io:滞后和无法解释的断开连接
node.js / socket.io: lag and unexplained disconnections
我使用 node.js 和 express 构建了一个两人实时视频游戏。双向通信由 socket.io 处理。该游戏只是 Space Invaders 的克隆版,您可以左右移动宇宙飞船并向敌人射击,无需图形或计算密集型操作。
该游戏在我的本地计算机上运行良好。当我在线测试它时(在 Heroku 上),我 运行 主要有两个问题:
- 游戏很卡(只是左右移动宇宙飞船是很难做到的)。我远远低于 Heroku 内存限制,我的应用程序的 Web 事务响应时间很好(平均低于 7 毫秒)。
- 有时一位玩家无缘无故断开连接(在客户端,游戏只是冻结)。
这是我的第一个nodejs/socket.io项目,所以我不知道这些问题是否可以解决,或者它是否是我们可以预期但在目前的发展状态下很难解决的技术问题这些技术。我还必须承认,我仍在使用 express 版本 3.2.6 和 socket.io 0.9.6。是否有充分的理由认为我的问题可以通过升级来解决(知道我在本地使用相同版本没有问题)?
编辑:
在本地主机上,我得到(好)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:我很乐意提供代码片段,但我不知道哪些代码对我的问题很重要。
我的问题是在工作中我的互联网连接通过代理,它可能不接受 websockets。 Socket.io 然后恢复到 xhr-polling 进行通信。
从工作地点以外的其他地点进行测试没有出现问题。
您可以使用 http://www.lagado.com/proxy-test 等网站来测试您是否通过代理连接到互联网。
我使用 node.js 和 express 构建了一个两人实时视频游戏。双向通信由 socket.io 处理。该游戏只是 Space Invaders 的克隆版,您可以左右移动宇宙飞船并向敌人射击,无需图形或计算密集型操作。
该游戏在我的本地计算机上运行良好。当我在线测试它时(在 Heroku 上),我 运行 主要有两个问题:
- 游戏很卡(只是左右移动宇宙飞船是很难做到的)。我远远低于 Heroku 内存限制,我的应用程序的 Web 事务响应时间很好(平均低于 7 毫秒)。
- 有时一位玩家无缘无故断开连接(在客户端,游戏只是冻结)。
这是我的第一个nodejs/socket.io项目,所以我不知道这些问题是否可以解决,或者它是否是我们可以预期但在目前的发展状态下很难解决的技术问题这些技术。我还必须承认,我仍在使用 express 版本 3.2.6 和 socket.io 0.9.6。是否有充分的理由认为我的问题可以通过升级来解决(知道我在本地使用相同版本没有问题)?
编辑:
在本地主机上,我得到(好)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:我很乐意提供代码片段,但我不知道哪些代码对我的问题很重要。
我的问题是在工作中我的互联网连接通过代理,它可能不接受 websockets。 Socket.io 然后恢复到 xhr-polling 进行通信。
从工作地点以外的其他地点进行测试没有出现问题。
您可以使用 http://www.lagado.com/proxy-test 等网站来测试您是否通过代理连接到互联网。