【问题标题】:C# MMO server structureC# MMO 服务器结构
【发布时间】:2013-10-06 22:28:43
【问题描述】:

我正在为演示游戏编写一个简单的 mmo 服务器。我正在使用 UDP 协议(​​UdpClient),但我想知道其他服务器是如何工作的?:

  1. 只有 1 个 UDP 客户端处理所有连接的客户端和消息并响应它们
  2. 服务器为每个连接的播放器创建一个新的 UDP 客户端实例?

我已测试连接 50 个发送“Ping”消息的客户端,服务器必须回复“Pong”。第 50 个“Pong”发送大约需要 10 秒(在本地主机上)(同时,服务器应该也向第一个玩家发送 ping,因此队列可以延长到几个小时,这是荒谬的)

【问题讨论】:

    标签: c# multithreading udp udpclient mmo


    【解决方案1】:

    其他服务器使用 1),即使用一个 Socket(我假设每个 UdpClient 有一个)从任何客户端监听。此外:

    • 这个 Socket 应该在服务器的整个生命周期内使用,即当一个数据报完成时不要创建一个新的。
    • 接收和发送应异步完成,因此接收/发送一个流不会阻碍接收/发送另一个流。
    • 注意您发送/接收的数据量 - 如果您从服务器向多个客户端发送/接收数据,则数据总量乘以客户端数量。

    在 localhost 上执行上述操作,有 50 个客户端发送 ping 并接收只有几个字节的 pong,假设其他进程没有使处理器最大化。

    【讨论】:

    • 所以你建议只使用一个 UDP 客户端但异步?
    • 是的,服务器上只需要一个UDP客户端实例。
    【解决方案2】:

    我将通过说我不知道​​ MMO 服务器的内部结构来限定我的答案。我有点惊讶,50 ping/pongs 需要 10 秒,我想,尤其是在 localhost 上,它会快得多。我怀疑您有某种问题,或者您的客户可能特别难以初始化。我建议您下载 Wireshark (http://www.wireshark.org/) 之类的东西,然后查看您的 IP 流量以了解实际情况。

    如果您玩 MMO,您还可以使用 wireshark 查看正在传输的数据包,并更好地了解他们的服务器在做什么。

    【讨论】:

      【解决方案3】:

      你一定是做错了什么。我编写了一个服务器,每秒处理 400 万条 ping/pong 消息,每条消息的传递时间为 10-20 毫秒。我正在使用 TCP 协议。

      我建议您阅读 Beej 的套接字编程指南,重写您的客户端/服务器网络代码,看看您是否获得了更好的数字: http://beej.us/guide/bgnet/

      【讨论】:

        猜你喜欢
        • 2016-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多