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

Lev*_*Lev 5 .net c# flash client-server protocols

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

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

Ono*_*dai 3

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

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

如果您的代码需要任何类型的同步内容,那么您可能需要对代码进行回复流控制,以及某种消息传递结构,其中消息具有 ID,并且可能具有它们作为回复的原始消息 ID。这将帮助您控制异步协议上的内容。在这种情况下,像 JSON 这样易于维护的协议可能会更好,正如 @ JustLogin提到的。

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

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

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

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