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

时间:2013-04-28 11:37:20

标签: c# .net flash client-server protocols

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

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

3 个答案:

答案 0 :(得分:3)

我认为,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(二进制JSON),因此在这种情况下使用JSON将简化数据库与其他所有内容之间的数据通信。

答案 1 :(得分:3)

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

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

研究结果是下一个协议:

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

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

答案 2 :(得分:3)

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

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

如果您的代码需要任何类型的同步内容,那么您可能需要对代码进行回复流控制,以及消息具有ID并且可能具有原始消息ID的消息类型的消息传递结构。这将有助于您甚至在异步协议上控制内容。在这种情况下,像JSON这样的易于管理的协议可能会更好,就像@ JustLogin 一样。

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

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

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

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