服务器 - C#,客户端 - Flash,数据交换协议

5
我们正在使用Flash编写在线多人游戏,希望使用.Net作为服务器端,我们需要双向通道以便通过套接字进行通信。
您能告诉我关于服务器和客户端之间交换数据的协议/格式的一些最佳实践吗? 在我看来,其中一个不错的选择可能是使用JSON序列化。
3个回答

4
我认为,JSON可能是最佳选择,让我解释一下为什么。
首先,JSON序列化的游戏流量很轻量级,因为JSON符号类似于“name: val”,而不是像“val”。
其次,对于游戏来说,JSON序列化是最直观的。XML和类XML的符号适用于多行数据,但游戏变量的值通常相当短(HP、mana、AP、damage等),可以用一行描述。
第三,Actionscript 3(希望您不要在AS2中编写MMO)拥有完美的JSON解码/编码工具。XML解析工具也很好,但在我看来,JSON的工具更好。此外,在Flash 11+中,JSON操作被极大地优化。
第四,许多高负载项目使用MongoDB缓存服务器,它的主要格式是BSON(二进制JSON),因此在这种情况下使用JSON将简化数据库与其他所有内容之间的数据通信。

3

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

我们尝试了不同的协议来寻找最适合我们在线扑克游戏的协议。

研究结果如下:

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

  1. 从套接字中加载前四个字节以获取包的大小和类型。
  2. 加载包体。
  3. 将包体发送到消息类型处理程序进行处理。

3
这要看情况而定。先忘掉涉及到的技术,集中关注你的特定通信需求。希望您不介意我也探讨一些相关的问题。
- 点对点(p2p)流:我们知道这个 - 全双工,正如你所提到的。 - p2p 模式:半双工还是全双工?数据是否同时交换,还是总是一个消息-响应机制? - 状态:您可能会有等待响应的代码,即使您的大部分交换是异步的。交换绝对异步吗?同步?混合?这一点与前面的紧密相关。 - 传输:数据突发,还是恒定流? - 带宽:您期望每秒传输多少字节/秒?它是目标网络的相当百分比吗(无线?移动?高速)? - 可靠/不可靠内容:数据包丢失是否会使您的客户端状态混乱?(这本质上不是坏事,只是一个规范。)
如果您的代码需要任何形式的同步内容,那么您可能需要在代码上使用回复流控制,并使用某种消息结构,其中消息具有ID并且可以具有原始消息ID作为其回复。即使在异步协议上,这将有助于您控制内容。在这种情况下,易于维护的协议(如JSON)可能更好,正如@JustLogin所提到的那样。
全双工意味着您需要在网络/解释器层上分阶段地存储更多数据,并且它可能必须处理异步通信。
如果性能是一个问题,并且根据您的具体情况,那么像@Viacheslav提出的建议可能很有吸引力。自定义协议可以进行大量优化,但代价是可维护性和可移植性(几种语言都有自己的JSON解释器,而自定义解释器可能需要实现或封装,增加流程中的层数,从而降低性能,或者需要代码转换)。
如果您不太在乎是否丢失一个或两个数据包,那么UDP可能是一个可行的解决方案。比TCP更少的控制意味着更轻的协议,但除非您实现自己的控制,否则您永远不确定数据是否到达了另一边。
简而言之:即使它们增加了一些开销,我仍然建议使用标准的低级别协议,例如JSON。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接