如何测试客户端服务器程序

时间:2013-09-30 17:02:09

标签: networking tcp udp multiplayer

我正在制作多人游戏,而且我经常想测试它是否完全适用于全球网络,因为有时候它只能在本地运行,所以我怎么能这样做而不将我的客户端发送给朋友来测试它。 / p>

2 个答案:

答案 0 :(得分:0)

如果您想为“全球网络”进行测试 - 您必须以这种方式进行测试。在本地网络上存在多种可能出错的问题。就在我的头顶

  1. 延迟(对游戏很重要)
  2. NAT(问题的常见原因取决于您的游戏架构 - 如果是P2P则更是如此)
  3. 安全
  4. 连接错误(Wifi / 3G间歇性丢失)

答案 1 :(得分:0)

当您通过互联网谈话而不是在本地主机或本地网络上运行时,网络的许多方面通常会略有不同。

  • 可能会发生各种延迟,这可能会在您的代码中抛出一些不良假设。
  • TCP流可能受TCP流量控制的影响(当TCP窗口填满发件人将停止发送并向您报告事实(或者如果您使用异步API,则可能不报告)。) LI>
  • TCP读取在localhost上返回“完整消息”,您自己的网络可能会开始返回消息片段。
  • UDP数据报可能会丢失,永远不会到达,也可能会多次或以任何顺序到达。

因此,您认为需要针对这些边缘情况测试您的代码是正确的,这些情况很少会出现在您自己的网络上。您认为仅仅将客户端发送给朋友或在远程计算机上运行它是不对的。

一种方法是建立一个专用的测试客户端,它发送已知的游戏并检查它是否得到预期的响应(这有多难取决于你的协议和你的游戏)。一旦你有了工作,那么让测试客户端故意发送数据,以便测试上面的项目。因此,如果您正在使用UDP,则可能会在测试客户端中放入一些代码,以便有时根本不会发送UDP数据报。客户应该认为它发送了它。网络层简单地抛弃它。这将测试您的UDP协议是否缺少数据报。然后多次发送一些数据报,然后发送一些不按顺序等。对于TCP添加延迟,将逻辑“消息”分解为单独的网络发送,它们之间有大的延迟;理想情况下,将每个不同的消息类型作为单个字节序列发送,以检查服务器的“消息累积代码”是否正常工作。

完成此操作后,您需要为客户端代码执行相同的操作,可能是通过在服务器的网络代码中添加“模糊测试”选项来执行相同类型的操作...

就我个人而言,我倾向于尝试退后一步,尽可能在专门的“单元测试”中做到这一点(我知道有些人会说这些不是单元测试,称之为你喜欢的,只是写下来!)。这些测试使用真实网络(与测试创建的虚拟服务器/客户端交谈)来运行您的网络层,并验证可怕的边缘情况。