2013-10-06 83 views
0

我正在编写用于演示游戏的简单mmo服务器。我使用UDP协议(UdpClient),但我不知道,其他服务器如何正在?:C#MMO服务器结构

  1. 是处理所有连接的客户端和消息,并回应他们
  2. 服务器只有1个UDP客户端创建一个新的UDP客户端实例为每个连接的玩家?

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

回答

1

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

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

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

+0

所以你建议只使用一个UDP客户端,但异步? –

+0

是的,服务器上只需要一个UDP客户端实例。 – markmnl

0

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

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

0

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

我建议您阅读Beej的指南,Socket编程,重写你的客户机/服务器网络代码,看看你得到更好的数字: http://beej.us/guide/bgnet/