我一直在寻找一个好的通用二进制网络协议定义框架,以提供一种以多种语言编写实时游戏服务器和客户端(想想魔兽世界或Quake III)的方法(例如Java后端服务器和iPhone前端用Objective-C和Cocoa编写的客户端).
我想支持Windows上的Java Flash客户端,iPhone客户端和C#客户端(以及XBOX上的XNA客户端).
我正在寻找一种通过TCP/IP或UDP套接字流连接有效发送/接收消息的方法.我不是在寻找可以通过HTTP Web服务发送的东西,比如JSON或XML编组的对象.虽然Hessian的二进制Web服务协议是一个非常有趣的解决方案
我想要一种网络协议格式和客户端/服务器基本实现,它允许客户端连接到服务器并以定义的协议发送任何消息,并接收协议中的任何消息,而不必绑定到某种RPC端点.我希望我的协议传入和传出的任何消息的通用流.这样我就可以支持诸如服务器每隔100毫秒向所有客户端发送游戏中各种实体的位置.
我发现的网络协议框架如下:
谷歌的协议缓冲区 - 但它缺乏对从你的协议发送/接收任意消息的支持.
Apache Thrift - 一个有趣的选项,但它主要面向RPC而不是通用游戏客户端/服务器套接字类型连接,客户端或服务器可以随时发送消息,而不仅仅是响应客户端RPC请求.
Raknet Multiplayer - Raknet提供完整的多人网络图书馆(独立开发免费,收入低于25万美元)
更新:OculusVR现在收购了RakNet及其Free/OpenSource.你可以在Github上找到它
Hessian Binary Web服务协议 - 是一种HTTP Web服务二进制协议,非常适合发送二进制数据,而无需使用附件扩展协议.
Raknet提供了一个很好的面向游戏/模拟的多人游戏库.
Apache Thrift和Google的协议缓冲区似乎是在游戏网络协议客户端/服务器架构中使用的最简单方法.
如果你想使用某种类型的服务器推送技术(如COMET)创建一个带有Java或Flash客户端的基于Web的游戏服务器,Hessian似乎非常适合.Hessian可能会提供一种非常有趣的方式来支持网络上的实时游戏,甚至能够在谷歌的App引擎或亚马逊的EC2等VM网络解决方案上托管它们.
关于为游戏和其他用途使用各种协议定义框架有一些讨论:
各种序列化框架的比较
Thrift vs Protocol Buffers - Thrift被宣布为更好的框架,因为它具有完全支持的RPC客户端/服务器实现
使用Protocol Buffers为客户端服务器Game API确定要解码的消息类型
使用thrift的双向RPC