【问题标题】:C# MMO server structureC# MMO 服务器结构
【发布时间】:2013-10-06 22:28:43
【问题描述】:
我正在为演示游戏编写一个简单的 mmo 服务器。我正在使用 UDP 协议(UdpClient),但我想知道其他服务器是如何工作的?:
- 只有 1 个 UDP 客户端处理所有连接的客户端和消息并响应它们
- 服务器为每个连接的播放器创建一个新的 UDP 客户端实例?
我已测试连接 50 个发送“Ping”消息的客户端,服务器必须回复“Pong”。第 50 个“Pong”发送大约需要 10 秒(在本地主机上)(同时,服务器应该也向第一个玩家发送 ping,因此队列可以延长到几个小时,这是荒谬的)
【问题讨论】:
标签:
c#
multithreading
udp
udpclient
mmo
【解决方案1】:
其他服务器使用 1),即使用一个 Socket(我假设每个 UdpClient 有一个)从任何客户端监听。此外:
- 这个 Socket 应该在服务器的整个生命周期内使用,即当一个数据报完成时不要创建一个新的。
- 接收和发送应异步完成,因此接收/发送一个流不会阻碍接收/发送另一个流。
- 注意您发送/接收的数据量 - 如果您从服务器向多个客户端发送/接收数据,则数据总量乘以客户端数量。
在 localhost 上执行上述操作,有 50 个客户端发送 ping 并接收只有几个字节的 pong,假设其他进程没有使处理器最大化。
【解决方案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/