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