Erlang游戏开发-协议
选择什么协议?
协议包含通讯协议和数据格式.
通讯协议
通讯协议目前常用的是:HTTP
和TCP
.其有各自的特点根据游戏的特点而进行选择.
HTTP
HTTP比较成熟,使用极其广泛.具有丰富的基础软件和工具.
对于简单的social game可以使用HTTP作为通讯协议.
这类游戏对实时性要求不是很高,使用HTTP也很容易做到性能扩展,可以较好的满足需求.
如果游戏前端使用HTML+js开发,那么只能使用HTTP了,需要较好的交互性和实时性时,只能
使用HTTP长轮询来实现了.如果前端使用flash开发,游戏交互复杂,实时性要求高,那么HTTP
便不合适了.
TCP
HTTP是高级的应用协议,而TCP便是比较基础的协议了.HTTP也是基于TCP实现.
对于一些web game,基本上采用TCP.其并发量不大(单服web game通常在线千人左右),而
实时性要求很高,尤其是ARPG游戏.因此TCP是不二选择.其前端大多使用flash实现(因为
HTML5之前,html+js无法创建TCP socket).至于非80,非443端口的防火墙问题,貌似现在
的网络环境下可以忽略.
数据格式
文本格式,比如xml,json或自定义均可作为传输的数据格式,文本格式最大的好处是可读,
便于调试,缺点是数据量比较大,冗余信息太多.(当然可以通过压缩来弥补).因此在web
game中很少使用文本作为数据传输格式.
除却文本就是二进制协议了.二进制协议也分多种:protobuf,thrift等通用二进制传输协议和
自定义二进制格式.使用protobuf和thrift的好处是通用性,多种语言均支持,再一个规模比较
大,使用多种开发语言的环境中比较合适.作为web game,通常是一个工作室负责一款产品,
client和server使用的技术和语言相对确定,因此这些通用二进制传输协议就不是最好的选择,
同时,其因为通用,也导致了一些性能下降.
目前大部分游戏是采用自定义二进制协议,基本结构为:头部几个字节表示数据体长度,随后为
数据体.在数据体中,可以划分出几个字节(如2个)表示某种消息.我们会为每种消息都定义数据
格式. 其大致的样子如下: [2字节数据长度][2字节消息类型,具体的消息体].
Erlang中如何处理?
再Erlang中实现这样的协议非常简单, 设置inet:setopts/2的
packet
选项为2,便可支持我们上面
的协议.Erlang自动会首先获取2个字节,作为长度,随后继续接受数据,知道这个包接收完成,
省去了我们自己处理解包,粘包的痛苦 :)(注意2个自己使用无符号的big-endian编码方式).
有了数据体,接下来需要处理2个字节的消息类型,Erlang还提供了一个贴心的选项:{header
, size}(注意这个选项只有在socket设置binary选项的时候有效).再这里我们设置{header, 2},这样我们收到的数据体,不是一整块,而是这样:[Byte1, Byte2 | Binary],Byte1,Byte2是Erlang为我们截取出的数据体的头2个字节. 对于熟悉Erlang的朋友,我提一个问题:
这个数据是格式规则的列表么?答案是No,这个列表是一个"畸形"的列表,因为其最后一个元素不是列表.有些绕远了... :(
还有,在Erlang中TCP,拥有一个active
选项,其取值为:true, false, once.看过书的都明白,其是用来控制TCP数据的接收方式.通过使用 inet:setopts(Sock, [{active, once}]),我们可以让数据乖乖的听话,主动发给我们一个数据,然后变不主动,我们处理完这个消息后,然后在设置active once,其继续再发给我们一个数据. 这样的好处是,不会因为{active, true},给我们发送了大量的数据,导致我们应接不暇.也不会让我们每次都手动 gen_tcp:recv/2数据,那么累人.
游戏中协议的消息类型达上百中,这个过程如果手工编码会非常累,应该在开始的时候,再确定好协议格式后,就书写脚本完成协议编解码的自动生成,一劳永逸!大大减少调试出错的可能.协议修改后,通过一个命令就可以重新生成代码.非常happy.(有的团队,更加geek,直接使用erlang:term_to_binary作为二进制协议,由flash端进行erlang term的解析,非常强大).
最后就是要动手,首先把网络和协议搞定,游戏之路就开始了 :)
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Erlang语言进行游戏服务器的开发实践。Erlang是一种功能强大的...《Erlang-game-server开发实践》这本书将引导你逐步探索这个领域,帮助你在实践中掌握Erlang游戏服务器开发的精华。
这些例子不仅有助于学习Erlang的基础语法,还可以帮助开发者理解如何在实际项目中应用Erlang进行软件开发。 描述中提到的例子包括“模式匹配”和“OTP使用”,这些是Erlang语言中的关键知识点。模式匹配是Erlang中...
Erlang是一种面向并发的、函数式编程语言,特别适合于构建高可靠性、分布式系统,尤其是在游戏开发领域中表现出色。这份"Erlang游戏程序学习完整PDF...对于想要涉足Erlang游戏开发的程序员来说,这是一份宝贵的资源。
- **概念**: Erlang节点之间通信的协议,支持跨节点的进程间通信。 - **格式**: 包含节点标识、消息类型等字段,保证了数据的安全传输。 - **实现**: 通过`net_adm`和`net_kernel`等模块实现分布式的功能。 #### 6....
Erlang是一款面向并发、分布式计算的编程语言,特别适合构建高可用性和容错性的系统。...对于想要学习Erlang游戏服务器开发的人来说,这是一个很好的起点,可以从编译运行该项目开始,逐步理解并掌握相关技术。
某流水过千W的erlang游戏后端项目,揭示了Erlang在处理大规模并发、实时性以及稳定性方面的强大能力。 1. **并发处理**:Erlang的轻量级进程(Lightweight Processes)机制使得它能够轻松处理大量并发连接,每个...
AI实验applet则展示了Erlang在处理计算密集型任务方面的潜力,如机器学习、自然语言处理或游戏AI。Erlang的并发模型允许开发者并行运行多个算法,从而加快计算速度,并且其错误恢复机制可以确保即使在算法出错时,...
在游戏开发领域,由于其并发处理能力和强大的故障恢复机制,Erlang常被用来构建可扩展、高可用性的游戏服务器。Ranch库提供了一种简单的方式来管理多个并发连接,并且它的API设计得简洁明了,使得开发者可以快速地...
本资源"erlang游戏服务器网关源码.zip"包含四份核心源代码文件:`server_app.erl`、`net_work.erl`、`main.erl`和`server_sup.erl`,它们是实现游戏服务器网关功能的关键部分。 1. **server_app.erl**: 这个文件...
总结,Erlang通过结合Websocket协议,可以实现高效、实时的客户端与服务器通信。配合rebar3构建工具,可以便捷地管理和构建Erlang项目,而emysql则提供了与MySQL数据库交互的能力。这三者结合,为构建实时通信应用如...
在实际开发中,Erlang Web 适用于构建高性能、高可用性的Web服务,如实时通信平台、大型社交网络、在线游戏服务器等。通过 erlangweb-1.0 压缩包,你可以获得框架的源代码,进一步了解其实现细节和使用方法,也可以...
6. **游戏源码分析**:对于初学者来说,分析游戏服务器的源码可以帮助理解Erlang在实际项目中的应用,包括如何处理玩家输入、如何维持游戏世界的状态、如何实现网络通信协议等。 7. **学习路径**:初学者可以通过...
这种语言最初由爱立信公司开发,目的是为了满足通信应用的需求,如控制交换机或转换协议等。 - **应用场景**:由于其设计初衷和技术特性,Erlang非常适合构建分布式、实时的软并行计算系统。这类系统通常包含数千个...
在当今的网络游戏开发领域,高性能、可扩展性以及良好的并发处理能力是服务器端架构的关键要素。Go-gaserver项目,作为一个基于Protoactor框架的游戏服务器,正是为满足这些需求而设计的。本文将深入探讨Go-gaserver...
由于文件中提到Flash和AS3.0,可以推断在游戏开发中,AS3.0被用于编写游戏逻辑、处理用户输入、网络通信等。 2. Erlang与AS3.0的关联:文件中出现了Erlang,这可能表明在MMORPG后端的分布式计算和并发处理方面可能...
### 编程Erlang:面向并发世界的软件开发 #### 核心概念解析 **编程Erlang**这本书深入探讨了如何使用Erlang语言来编写高效、可靠的并发程序。Erlang是一种专为构建高度容错性系统而设计的编程语言,特别适合于...
总结来说,"otp_win64_22.3.exe"是Erlang OTP的Windows 64位版本,用于在Windows环境中搭建Erlang运行环境,为使用Erlang语言开发并发、分布式应用,特别是像RabbitMQ这样的消息中间件提供基础支持。了解并掌握...
无论你是从事erlang、c#还是lua的项目,甚至是游戏开发,它都能成为你提升开发效率、优化通信协议的得力助手。通过深入理解并熟练运用xxtools-master,你将能够更好地应对各种开发挑战,创造出更加高效、稳定的应用...
### Go语言在游戏项目中的应用案例...总之,Go语言凭借其出色的并发模型、简洁的语法和强大的标准库,在游戏开发领域展现出了巨大的潜力。随着Go语言社区的不断发展和完善,相信未来会有更多基于Go语言的成功案例出现。