gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:32:16 24 4
gpt4 key购买 nike

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

问题

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

问题

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

  • 玩家的互联网连接状况不佳,这也无济于事。
  • 玩家和服务器(土耳其 <-> 荷兰)之间的距离太远。
  • 服务器(CentOS 机器)或数据中心出现问题。
  • 服务器过载(尽管它也在低负载下发生)。
  • 我们的软件有错误。
  • 还是其他原因?

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

已知数据

  • 每当报告虚假断开连接并且我检查日志时,大多数时候我看不到该玩家被服务器软件主动踢出,只看到连接已关闭。
  • 有一个内部监控服务,它有一堆 localhost 连接到游戏服务器,就像玩家一样,它不会断开连接。

其他

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

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

最佳答案

我会要求玩家允许您启用“匿名使用数据”,就像许多应用程序所做的那样,以便定期将调试信息从他们的 session 上传回给您。这就是您解决这些情况的方式。

从那里开始,当断开连接发生时,您需要的是一个非常冗长的日志。当断开连接发生时,捕获任何抛出的异常(并且不要忘记通过调用 .getCause() 记录 cause - 尽可能多地调用 .getCause( ) 根据需要,直到您一直记录回根本原因),以及将客户端日志与服务器端日志匹配所需的任何相关数据。您可能需要的信息包括 session ID、游戏 ID、时间戳等。试想一下,“假设我对连接的两端都有深入了解,我认为我需要哪些信息来解决这个问题?”这就是要求用户上传使用情况和调试数据的最终结果。

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

您永远不会将断开连接减少到零,但是在您看到足够多的情况后,此信息应该可以帮助您将断开连接的发生减少到您无法单独控制的情况,此时您可以塑造自己的力量网络最终会结束,您将尽可能接近网络可靠性的“最佳情况”。

关于java - 如何找到错误 TCP 连接的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9209556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com