我们正在Flash希望.Net服务器端编写在线多人游戏,我们需要双工通道,因此使用套接字完成通信。
你能告诉我一些关于服务器和客户端之间交换数据的协议/格式的最佳实践吗?IMO 一个不错的选择可能是使用 JSON 序列化。
我们正在Flash希望.Net服务器端编写在线多人游戏,我们需要双工通道,因此使用套接字完成通信。
你能告诉我一些关于服务器和客户端之间交换数据的协议/格式的最佳实践吗?IMO 一个不错的选择可能是使用 JSON 序列化。
我认为,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 和其他一切之间的数据通信。
好的解决方案是专有协议,因为它将提供完美的性能和流量优化。
我们已经尝试了不同的协议来为我们的在线扑克搜索最佳协议。
研究结果是下一个协议:
前两个字节是包类型。包的后两个字节是包的大小。N字节包体
这取决于。暂时忘记涉及的技术,专注于您的特定通信需求。希望你不介意我也探讨一些相关的观点。
如果您的代码需要任何类型的同步内容,那么您可能需要对代码进行回复流控制,以及某种消息结构,其中消息具有 ID 并且可能具有它们作为回复的原始消息 ID。即使在异步协议上,这也将帮助您控制内容。在这种情况下,像 JSON 这样易于维护的协议可能会更好,正如@JustLogin所提到的。
全双工意味着您将在网络/解释器层上暂存更多数据,并且它可能必须处理异步通信。
如果性能是一个问题,并且取决于您的具体情况,那么像@Viacheslav提出的建议可能很有吸引力。可以以可维护性和可移植性为代价对自定义协议进行大量优化(几种语言都有自己的 JSON 解释器,而自定义解释器可能需要实现或封装,从而在流程中添加层,从而降低性能,或者需要代码转换。 )
如果您不在乎是否丢失一两个数据包,那么 UDP 可能是一个可行的解决方案。比 TCP 更少的控制意味着更轻的协议,但是除非您实现自己的控制,否则您永远无法确定数据是否到达另一端。
TL;DR 版本:我会坚持使用标准的低级协议,例如 JSON,即使它们会增加一些开销。