C#MMO服务器结构

时间:2013-10-06 22:28:44

标签: c# multithreading udp udpclient mmo

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

  1. 只有1个UDP客户端处理所有连接的客户端和消息并对其进行响应
  2. 服务器为每个连接的播放器创建一个新的UDP客户端实例?
  3. 我测试过连接50个发送“Ping”消息的客户端,服务器必须回复“Pong”。第50个“Pong”发送需要大约10秒钟(在localhost上)(同时,服务器应该向第一个玩家发送ping,因此队列可以延长到几个小时,这是荒谬的)

3 个答案:

答案 0 :(得分:1)

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

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

在localhost上执行上述操作,50个客户端发送ping并接收只有几个字节的pong应该花费不到1ms,假设某些其他进程没有最大化处理器。

答案 1 :(得分:0)

我打算通过说我不知道​​MMO服务器的内部结构来限定我的答案。我有点惊讶,50个ping / pongs需要10秒,我想,特别是在localhost上它会快得多。我怀疑你有某种问题,或者你的客户初始化时特别复杂。我建议你下载像Wireshark(http://www.wireshark.org/)这样的东西,看看你的IP流量,看看实际发生了什么。

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

答案 2 :(得分:0)

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

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