5

我们正在Flash希望.Net服务器端编写在线多人游戏,我们需要双工通道,因此使用套接字完成通信。

你能告诉我一些关于服务器和客户端之间交换数据的协议/格式的最佳实践吗?IMO 一个不错的选择可能是使用 JSON 序列化。

4

3 回答 3

4

我认为,JSON 可能是最好的选择,让我解释一下原因。

首先,JSON 序列化的游戏流量是光加权的,因为 JSON 表示法类似于“name : val”,而不是"<name> val </name>".

其次,JSON序列化对于游戏来说是最直观的。XML 和类似 XML 的符号对多行数据很有用,但游戏中变量的值通常很短(HP、法力、AP、伤害等),可以用一行来描述。

第三,Actionscript 3(我希望你不会在 AS2 中编写 MMO)拥有完美的 JSON 解码/编码工具。XML 解析工具也很好,但 IMO、JSON 更好。此外,在 Flash 11+ 中,JSON 操作得到了极大的优化。

第四,很多高负载的项目使用 MongoDB 的缓存服务器,它的主要格式是 BSON(Binary JSON),所以在这种情况下使用 JSON 将简化 DB 和其他一切之间的数据通信。

于 2013-05-07T13:05:27.183 回答
3

好的解决方案是专有协议,因为它将提供完美的性能和流量优化。

我们已经尝试了不同的协议来为我们的在线扑克搜索最佳协议。

研究结果是下一个协议:

前两个字节是包类型。包的后两个字节是包的大小。N字节包体

  1. 从套接字加载前 4 个字节以获取包的大小和类型。
  2. 加载包体
  3. 将要处理的包体发送到消息类型处理程序
于 2013-05-13T12:45:38.463 回答
3

这取决于。暂时忘记涉及的技术,专注于您的特定通信需求。希望你不介意我也探讨一些相关的观点。

  • 点对点 (p2p) 流:我们知道这一点 - Duplex,正如您所提到的。
  • p2p 模式:半双工还是全双工?数据会同时交换,还是始终是消息响应机制?
  • 状态:您可能有等待响应的代码,即使您的交换的主要部分是异步的。交换是绝对异步的吗?同步?混合?这一点与前一点密切相关。
  • 传输:数据突发还是恒定流?
  • 带宽:您希望传输多少字节/秒?它是否占您目标网络的相当大比例(无线?移动?高速?)
  • 可靠/不可靠的内容:丢失数据包是否会使您的客户状态陷入混乱?(这本身并不是一件坏事,只是一个规范。)

如果您的代码需要任何类型的同步内容,那么您可能需要对代码进行回复流控制,以及某种消息结构,其中消息具有 ID 并且可能具有它们作为回复的原始消息 ID。即使在异步协议上,这也将帮助您控制内容。在这种情况下,像 JSON 这样易于维护的协议可能会更好,正如@JustLogin所提到的。

全双工意味着您将在网络/解释器层上暂存更多数据,并且它可能必须处理异步通信。

如果性能是一个问题,并且取决于您的具体情况,那么像@Viacheslav提出的建议可能很有吸引力。可以以可维护性和可移植性为代价对自定义协议进行大量优化(几种语言都有自己的 JSON 解释器,而自定义解释器可能需要实现或封装,从而在流程中添加层,从而降低性能,或者需要代码转换。 )

如果您不在乎是否丢失一两个数据包,那么 UDP 可能是一个可行的解决方案。比 TCP 更少的控制意味着更轻的协议,但是除非您实现自己的控制,否则您永远无法确定数据是否到达另一端。

TL;DR 版本:我会坚持使用标准的低级协议,例如 JSON,即使它们会增加一些开销。

于 2013-05-13T16:41:00.197 回答