如何找到TCP连接错误的原因

时间:2012-02-09 10:56:08

标签: java testing tcp monitoring

我们正在开发一款在线游戏,玩家可以使用持久的TCP连接与服务器进行通信。持续存在,其生命周期是玩家的会话,如果连接关闭,玩家将被抛出游戏(尽管客户端会尝试自动重新连接)。

问题

现在,当然一切都在我们的办公室工作正常(连接到测试和现场服务器),但我们的客户报告说一些玩家断断续续(每隔几秒钟),并且他们自己也经历过(尽管他们的办公室在同一栋楼里。)

问题

如何找出这些断开连接的原因?是因为:

  • 玩家网络连接不良,无法提供帮助。
  • 玩家与服务器之间的距离(土耳其< - >荷兰)太长。
  • 服务器(CentOS计算机)或数据中心出现问题。
  • 服务器过载(尽管它也在低负载下发生)。
  • 我们的软件出错。
  • 还是其他一些原因?

该软件是用Java编写的。它会在玩家断开连接时记录,如果它主动踢它们(例如,不发送保持活动消息),它也会记录它。

已知数据

  • 每当报告虚假断开连接并检查日志时,大部分时间我都没有看到该播放器被服务器软件主动踢出,只看到连接已关闭。
  • 有一个内部监控服务,它与游戏服务器有一堆 localhost 连接,与玩家的方式相同,并且不会断开连接。

其他

还有许多像我们这样的在线游戏。他们如何处理这个问题? (除非问题出在服务器/数据中心,否则解决方案很明显)

  • 他们使用UDP吗?我知道动作游戏的速度,但我认为TCP是正常的,例如在线扑克和其他慢速游戏? (这不会对我们有帮助,我们的客户端软件是用Flash制作的,不支持UDP)
  • 是否可以进行一些TCP调整以使其更宽松?
  • 或者他们也是这样断开连接,只是更透明地重新连接?
  • 网上有关于此的信息吗?

1 个答案:

答案 0 :(得分:1)

我会要求玩家允许您启用“匿名使用数据”,就像许多应用程序一样,定期将调试信息从他们的会话上传回给您。这就是你弄清楚这些情况的方法。

从那里,断开连接时你需要的是一个非常详细的日志。当发生断开连接时,捕获所引发的任何异常(并且不要忘记通过致电.getCause()来记录cause - 根据需要拨打.getCause()的电话,直到你'我们一直记录回根本原因),以及将客户端日志与服务器端日志匹配所需的任何相关数据。您可能需要的信息包括会话ID,游戏ID,时间戳等。只要想一想,“我认为我需要哪些信息来解决这个问题,假设我已经了解了连接的两个方面?”这就是要求用户上传使用情况和调试数据最终会得到的结果。

从那里你应该能够找出至少一些你可以控制它的情况 - 也就是说,你可以在哪里改变你的客户端/服务器代码以减轻一些问题。在某些情况下,如果问题是客户端的配置或故障设备(或者可能是您之间无法控制的设备之一),您将不得不依赖强大的重新连接。

您永远不会将断开连接减少到零,但是在您看到足够多的情况后,此信息应该可以帮助您减少断开与单独控制之外的情况的连接,此时您的力量可以变形网络将最终结束,您将尽可能接近具有网络可靠性的“最佳案例场景”。