服务器端- c#,客户端- Flash,数据交换协议
本文关键字:交换 协议 数据 客户端 服务器端 Flash | 更新日期: 2023-09-27 18:11:25
我们正在用Flash wish 编写在线多人游戏。. Net服务器端,我们需要双工通道,所以通信是使用套接字完成的。
你能告诉我一些关于服务器和客户端之间交换数据的协议/格式的最佳实践吗?在我看来,一个好的选择可能是使用JSON序列化。
我认为JSON是最好的选择,让我解释一下为什么。
首先,JSON序列化的游戏流量是轻量级的,因为JSON表示法类似于"name: val",而不像"<name> val </name>"
。
其次,JSON序列化对于游戏来说是最直观的。XML和类似XML的符号适合多行数据,但游戏内变量的值通常很短(HP、法力、AP、伤害等),可以用一行来描述。
第三,Actionscript 3(我希望你不会在AS2中编写MMO)拥有完美的JSON解码/编码工具。xml解析工具也不错,但在我看来,JSON更好。此外,在Flash 11+中,JSON操作得到了极大的优化。
第四,许多高负载项目使用MongoDB的缓存服务器,它的主要格式是BSON(二进制JSON),所以在这种情况下使用JSON将简化DB和其他所有东西之间的数据通信。
看情况。暂时忘记相关的技术,专注于你具体的通信需求。希望你不介意我也探讨一些相关的问题。
- 点对点(p2p)流:我们知道这个-双工,正如你提到的。
- p2p模式:半双工还是全双工?数据是同时交换的,还是始终是消息响应机制?
- State:您可能有等待响应的代码,即使您的交换的主要部分是异步的。交换是绝对异步的吗?同步?混合吗?这一点与前一点密切相关。
- 传输:数据突发,还是恒定流?
- Bandwidth:你期望的流量是多少字节/秒?它是否占目标网络(无线网络)的相当大的比例?移动吗?高速铣?)
- 可靠/不可靠的内容:丢失数据包会使您的客户端状态混乱吗?(这本身并不是一件坏事,只是一个规范。)
如果您的代码需要任何类型的同步内容,那么您可能需要对代码进行应答流控制,以及某种类型的消息传递结构,其中消息具有ID,并且可能具有原始消息ID,它们是回复。这将帮助您甚至在异步协议上控制内容。在这种情况下,像JSON这样易于维护的协议可能更好,就像@JustLogin提到的那样。
全双工意味着你在网络/解释器层上存储了更多的数据,并且它可能必须处理异步通信。
如果关注性能,并根据您的具体情况,那么像@Viacheslav提出的建议可能很有吸引力。自定义协议可以大量优化,但代价是可维护性和可移植性(一些语言有自己的JSON解释器,而自定义解释器可能需要实现或封装,在过程中添加层,从而降低性能,或者需要代码转换。)
如果你不在乎一个或两个数据包丢失,那么UDP可能是一个可行的解决方案。比TCP更少的控制意味着更轻的协议,但除非你实现自己的控制,否则你永远无法确定数据是否到达了另一端。
TL;DR版本:我会坚持使用标准的底层协议,比如JSON,即使它们会增加一些开销。
好的解决方案是专有协议,因为它将提供完美的性能和流量优化。
我们尝试了不同的协议来搜索一个最好的在线扑克。
研究结果是下一个协议:
前两个字节是包类型。包的第二个两个字节是包的大小。N字节的包体
- 从套接字中加载前4个字节以获取包的大小和类型。
- 加载包体
- 将包体发送给进程到消息类型处理程序