gpt4 book ai didi

.NET 客户端 - 服务器应用程序被卡住,需要修复!

转载 作者:行者123 更新时间:2023-12-04 20:22:19 25 4
gpt4 key购买 nike

你好 Stack Overflow 的好人,
我有一个与数百个客户端一起运行的 .NET 客户端-服务器应用程序。该项目大约一年前从 VB6 迁移到 .NET,它是一个纸牌/棋盘游戏平台。
尽管我会尽量在下面提供尽可能多的细节,但问题是当里面有 40-70 名玩家时, channel 会被卡住。

建筑

1.服务器(.NET 4.0)

  • 分为三个项目:ServerNET、Listener、Channel
  • 监听器的作用类似于客户端首先连接的登录服务器。它负责检查版本和帐户信息等内容。

    还让客户端选择要连接的 channel 。它基本上是一个暂时的 TCPListener,监听任何试图永远连接的人。这不是双方僵持的原因。
  • Channel 代表单个端口,客户端在使用 Listener 完成后连接到 Channels。很像航天飞机,这是主要部分。类似于 MIRC channel ,它将所有用户绑定(bind)在里面,大部分数据发送给同一 channel 内的人,例如聊天和您可以加入的由其他玩家创建的游戏,由服务器托管。这是一个控制台应用程序,用作玩家的中心。玩家信息保存在“Client”类中,其中包括 TCPClient 和一些其他属性。每个客户端运行一个线程并进行由服务器处理的异步调用。这些“Client”对象也保存在名为“ClientCollection”的集合类中。当里面大约有 40-70 名玩家时, channel 会被卡住。每个 channel 最多允许 100 名玩家。
  • ServerNET 是主体,并执行与整个系统相关的所有其他常规工作,而不是特定于 channel 的。这是一个表单应用程序并运行诸如服务器选项之类的东西。

  • 2. 客户端 (.NET 2.0)
  • 与 TCPClient 一起运行,主要是单线程,而服务器是多线程的。
  • 必须使用 .NET 2.0。
  • 主要由视觉效果和其他不重要的东西组成。

  • 当有 40 多个客户端连接到单个 channel 时,它开始完全随机卡住(或者这就是我们现在所拥有的,没有证据或足够的数据来指出什么是完全错误的)。我们真的不认为网络流量是问题(还不太确定),因为我们已经在具有各种设置的不同服务器机器上进行了尝试。我们使用的所有服务器机器都能够在硬件方面处理那么多进程。所以这是关于方法和代码方面的事情。

    我们努力解决这个问题的原因是我们不确定是什么导致了它。请查看以下示例:
    系统 A 在其 channel #1 中有 55 人在线,并且无论如何都不会被卡住。系统 A 使用 A1 IP, channel 在 16xxx 端口上。
    系统 B 的第 4 channel 有 25 人在线,并且它会随机卡住一两分钟。系统 B 使用 B1 IP 和 18xxx 作为 channel 端口。它与系统 A 在同一台机器上,不会被卡住。

    总而言之,它看起来与在线人数无关,但当人数增加时,它会更频繁地发生。

    我们尝试在 Channel 项目的无限循环中滚动 Application.DoEvents(),认为某些 X 进程导致 channel 进入卡住状态几分钟,从而导致 channel 暂停。然后它会在几秒钟内执行在卡住时排队的每个操作。 CPU 使用率平均在每个 channel 7%-20% 之间,看起来越来越好。然而,这不是永久有效的解决方案。

    我们怀疑的事情:
  • 持有玩家和 TCPClients 的 ClientCollection 继承自 CollectionBase。也许这在同步过程中造成了一些困惑。这在过去曾经是一个数组,我们遇到的这些问题较少。也许它不应该从 CollectionBase 继承,而是其他什么?
  • 我们使用 SyncLock(C# 中的锁)来同步 ClientCollection。 (虽然我们在开始使用锁之前就遇到了这个问题)

  • 服务器信息
    英特尔至强 X3460 2.80GHz
    16 GB 内存
    64 位 Windows Server 2008 企业版

    我知道在不查看整个代码的情况下无法解决该问题,但我很遗憾无法发布代码。相反,我正在寻找一个想法,让我进入某个方向。但是,我们很乐意分享解决此问题的任何其他信息。

    感谢大家的帮助!

    最佳答案

    我们在一个非常相似的应用程序上遇到了一个非常相似的问题(我们将统计数据推送到了大约 1300 个用户)。

    我最好的猜测是,在您的 TCPClient 上,您设置了无限超时。不幸的是,这是默认行为。因此,当 TCPClient 阻止读取时,它有时会完全卡住。

    将超时设置为 30 秒(或更适合您的情况)。

    TcpClient newClient = incoming.AcceptTcpClient();
    newClient.NoDelay = true; // Send & receive immediately, even when the buffers aren't full
    newClient.ReceiveTimeout = 30000;
    newClient.SendTimeout = 30000;

    关于.NET 客户端 - 服务器应用程序被卡住,需要修复!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5143046/

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