基于netty的rts游戏服务器搭建

最近在读《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缓冲区的大
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值