之前在开发游戏的时候我们采用smartfoxserver这个java开发的游戏引擎,这个引擎在开发回合制游戏方面速度还是不错的。但是面对客户日益增长的需求还是有些力不从心。比如集群,比如灾备,热切换,热更新,热降级,面对上10G的流量攻击,隐藏真实的游戏服务地址等等需求 。这些问题虽然通过java编程和某些方法都能解决。但是权衡起来成本和精力都感觉不值。于是我一直在寻找一种能解决替换smartfoxserver的方案。无意之中发现了erlang恰恰能够解决我上述问题。于是便引起了我对erlang的探究。游戏通信框架主要由 通信,协议,后台服务组成。游戏通信框架我们首先要解决的就是通信问题,所以我第一个探究的也就是tcp socket 通信。
erlang socket 通信的模式
1. 主动消息获取(非阻塞)优点 接受消息简单 缺点 当客户端消息远远大于服务器端处理消息的时候 服务器崩溃
2. 被动消息获取(阻塞) 优点 可以控制处理消息的速度防止流量攻击 缺点 接受消息稍微复杂 要代码处理 recv
3. 混合消息获取 (半阻塞)优点 接受消息方便,可以防止流量攻击 是前两种模式的一个综合
经过多种对比和实验了后我选择了 混合消息获取模式。为了对这种模式的探究,我结合上一篇rebar template 做了一个简单消息发送,接收,连接用户发送消息广播的简单服务器端。下面是我实现的过程。
1. 使用rebar 创建项目 rebar create template=simple_game projectid=game_socket
==> thinkpad (create) Writing game_socket/README.md Writing game_socket/Makefile Writing game_socket/.gitignore Writing game_socket/rebar.config Writing game_socket/start-dev.sh Writing game_socket/apps/game_socket/src/game_socket.app.src Writing game_socket/apps/game_socket/src/reloader.erl Writing game_socket/apps/game_socket/src/game_socket.erl Writing game_socket/apps/game_socket/src/game_socket_app.erl Writing game_socket/apps/game_socket/src/game_socket_sup.erl Writing game_socket/apps/game_socket/src/game_socket_server.erl Writing game_socket/deps/README.md Writing game_socket/rel/files/vm.args Writing game_socket/rel/reltool.config Writing game_socket/rel/files/app.config Writing game_socket/rel/files/erl Writing game_socket/rel/files/nodetool Writing game_socket/rel/files/game_socket