最近在读《Netty实战》,便使用netty搭建了一套rts游戏的服务器框架!
服务器分为三个部分:
(1)gateServer网关服务器:顾名思义网关服务器负责协议的接收与分发
(2)lobbyServer大厅服务器:大厅服务器处理用户的登录,注册,创建房间,查看战绩等逻辑
(3)battleServer战斗服务器:负责处理房间内对战的游戏逻辑,使用单例模式,帧同步的方法实现同一房间内不同玩家之间的一致性
在这里简单介绍一下帧同步:
(1)客户端每隔一段时间采集用户的所有指令发送给服务端
(2)服务器每隔一段时间将当前所有的游戏数据推送给客户端
(3)客户端每次用户做出指令的时候先做出预处理,当收到服务端的指令后进行同步
(4)无论客户端还是服务端发送协议的时间间隔都是毫秒级,每秒至少发送20-30次,这样就能基本保证不同客户端之间的同步,就想帧动画一样,我们服务端发送的同步协议也可以理解为一次为一帧
服务器使用到的技术与框架:
使用maven 模块式管理(使项目目录看起来一目了然,利用好maven的继承关系,可以避免重复写很多pom文件中的标签),netty框架(应该是最好用的java通信框架吧),redis
下面上干货:
public class LobbySever {
//基础配置信息
//log日志
private static final Logger logger = LoggerFactory.getLogger(LobbySever.class);
//服务器IP(可配置到配置文件)
private static final String IP = "127.0.0.1";
//端口号(可配置到配置文件中)
private static final int port = 8088;
//分配用于处理业务的线程组数量 Runtime.getRuntime().availableProcessors()获取jvm可用的线程数
protected static final int BisGroupSize = Runtime.getRuntime().availableProcessors() * 2;
//每个线程组中线程的数量
protected static final int worGroupSize = 4;
//NioEventLoopGroup进行事件处理,如接收新连接以及数据处理
private static final EventLoopGroup bossGruop = new NioEventLoopGroup(BisGroupSize);
private static final EventLoopGroup workerGroup = new NioEventLoopGroup(worGroupSize);
protected static void run() throws Exception{
//serverBootstrap 服务端引导
ServerBootstrap bootStrap = new ServerBootstrap();
bootStrap.group(bossGruop, workerGroup);
//指定所使用的 channel 有nio oio linux有epoll(性能比nio强大的异步非阻塞)
bootStrap.channel(NioServerSocketChannel.class);
bootStrap.childHandler(new ChannelInitializer<SocketChannel>(){
@Override
protected void initChannel(SocketChannel ch) throws Exception {
//ChannelPipeline链 将所有的业务逻辑层连接到一起
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new RtsEncoder());
pipeline.addLast(new RtsDecoder());
//pipeline.addLast("logging",new LoggingHandler(LogLevel.WARN));
//注册HeartBeatReqHandler
pipeline.addLast(new HeartBeatReqHandler());
//注册LoginHandler 多个channelHandler执行顺序为注册顺序
pipeline.addLast(new LoginHandler());
}
//ChannelOption设置tcp缓冲区的大