【转】一个java页游服务器框架
源地址:http://www.cnblogs.com/metoy/p/4305326.html?utm_source=tuicool&utm_medium=referral
一、前言
此游戏服务器架构是一个单服的形式,也就是说所有游戏逻辑在一个工程里,没有区分登陆服务器、战斗服务器、世界服务器等。此架构已成功应用在了多款页游服务器 。在此框架中没有实现相关业务逻辑,只有简单的测试用的注册登陆功能。但在此框架中添加相应的业务逻辑也是比较轻松的,只需要添加相应的协议,编写对应的消息处理器即可。
下面是项目代码的地址:
服务器工程---GameServer,游戏服务器工程
测试客户端---TestClient,模拟客户端与服务器通信,用于测试服务器功能
项目工具 ---Tools,服务器搭建用到的jar包以及相关eclipse插件
二、服务器运行环境
此服务器是基于tomcat启动,所以GameServer是一个web工程,但此游戏服务器还是基于socket通信的,没有使用tomcat的http通信。游戏服务器的启动是通过在WEB-INF目录下的web.xml中添加一个监听器。这个监听器用来监听tomcat的启动和停止,当tomcat启动时则启动游戏服务器开始监听端口,当tomcat停止时则做相应的销毁操作。
可能很多人会疑惑为什么要基于tomcat呢?
基于tomcat运行有很多优势:
1、方便调试。在我们调试服务器程序时,可是利用tomcat的热加载功能,使修改的代码不用重启就可以生效
2、方便打包部署。部署一个web程序到tomcat是一个比较容易的事,对第三方jar包的依赖tomcat也会帮忙处理好
3、利用tomcat提供的数据源。这可能不算是优势,但起码还算便捷
4、方便开发GM。我们可以很容易的在次架构中加入一个机遇web的管理系统,直接管理当前游戏服务器的在线玩家
三、通信层
java开发socket服务器最常用的就是mina和netty这两个nio框架。网上有测试说netty性能稍好一些。但是由于mina在生产环境中没遇到什么问题,而且本人对mina源码比较熟悉,还是采用了mina作为通信层框架。(netty3跟mina代码结构差不多,但是netty4变化比较大,本人稍微未对源码理解透)
通信协议:flag(1 byte)+length(4 byte,消息号加消息内容的长度)+protocol code(4 byte)+content
flag:是一个预留标识
length:表示消息号和消息内容的长度
protocol code:自定义消息号,通过次消息号选择相应的消息处理器,自然消息号是不能重复的,一个int表示范围足够使用
content: 消息内容,一个有序的数据的数组。protocol code和content都要在开发功能时定义在‘消息协议’文档中的,例如GameServer项目中的“消息协议.xls”
此项目中没有对消息内容进行加密,若要加密也是很容易添加上。
消息处理:
服务器收到客户端发来的消息,MsgDispatcher会根据其消息号选择对应的MsgProcessor进行处理。MsgProcessor会读取content做相应的处理。
此架构的持久层使用了ibatis,可能大家觉着ibatis已经过时,现在最多时用的是mybatis。但在生产环境中ibatis一直未出现什么问题,还是可以再用的。还有mybatis的使用必须每次open一个connection使用完必须close掉,多少感觉有点麻烦(如果使用spring aop到可以避免这种问题)。而在ibatis中,它提供了一个SqlMapClient类,这个类是线程安全的,我们只需要把数据库操作交到SqlMapClient,它内部会帮我们open、close数据库连接。
做游戏开发都知道,游戏对数据库的要求比较低,我们不需要什么复杂的数据库操作,所以在持久层我们使用ibator做代码生成工具(相应的插件在Tools项目中有),可以节省大量的开发工作。
以上是对这个java页游服务器的简单概述,具体代码细节请看项目源码,语言描述似乎有点困难^_^。篇幅可能有点小,希望管理员不要老给移除掉,
【转】一个java页游服务器框架的更多相关文章
- 一个java页游服务器框架
一.前言 此游戏服务器架构是一个单服的形式,也就是说所有游戏逻辑在一个工程里,没有区分登陆服务器.战斗服务器.世界服务器等.此架构已成功应用在了多款页游服务器 .在此框架中没有实现相关业务逻辑,只有简 ...
- 一个JAVA的WEB服务器事例
其实编写一个入门级别的JAVA的WEB服务器,很简单,用SOCKET类即可实现.相关内容可以参考:http://www.cnblogs.com/liqiu/p/3253022.html 一.首先创建一 ...
- distri.lua重写开源手游服务器框架Survive
Survive之前采用的是C+lua的设计方式,其中网关服务器全部由C编写,其余服务全部是C框架运行lua回调函数的方式编写游戏逻辑. 鉴于一般的手游对服务器端的压力不会太大,便将Survive用di ...
- 一个 Java 的 Socket 服务器和客户端通信的例子
一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程: 先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请 ...
- [置顶] java web 动态服务器
写了一个java web 动态服务器,主要通过内部类来实现,动态类使用了外部类,采用了 classforname 实例化,动态类的构造方法不能带参数, 效果都出来了,分享给有需要的 朋友.判断做的不够 ...
- Java字节码操纵框架ASM小试
本文主要内容: ASM是什么 JVM指令 Java字节码文件 ASM编程模型 ASM示例 参考资料汇总 JVM详细指令 ASM是什么 ASM是一个Java字节码操纵框架,它能被用来动态生成类或者增强既 ...
- abelkhan服务器框架
abelkhan是一个开源的游戏服务器框架.目标是提供一个稳定.高效.可扩展的服务器框架. github:https://github.com/qianqians/abelkhan 论坛:http:/ ...
- 我的Java之旅——第一个Java程序
在简单的看了一点Java的基本内容后,我开始尝试写自己的第一个Java程序.由于某些原因,学校官方的教务APP看不了自己这学期的平均绩点,就想着自己动手,写一小段代码,算一下自己的平均绩点.程序的功能 ...
- java开源工具包-Jodd框架
java开源工具包-Jodd框架 / 2019-07-24 Jodd是一个Java工具包和微型框架,Jodd 工具包含一些实用的工具类和小型框架,增强了 JDK 提供很多强大的功能,可以帮助实现 ...
随机推荐
- 数组的reduce方法的应用
var values = [1,2,3,4,5] var sum = values.reduce(function(pre,cur,index,array){ return pre + cur }) ...
- 远程链接mongoDB robomongo
墙裂推荐一个软件robomongo 下载地址:https://robomongo.org/download 最初不用这个软件的时候需要shell链接mongoDB,折腾了半天结果版本不匹配 用robo ...
- 【BZOJ2049】[SDOI2008] Cave 洞穴勘测(LCT维护连通性)
点此看题面 大致题意: 有\(n\)个洞穴,\(3\)种操作:连一条边,删一条边,询问两点是否联通. \(LCT\)维护连通性 这道题应该是\(LCT\)动态维护连通性的一道模板题. 考虑将\(x\) ...
- iOS 集成支付宝过程中 我遇到的一些坑,请大家注意啦(ALI69错误,ALI64错误)
支付宝很早一段时间就集成了,之前由于一直忙于开发就没有总结,今天整理桌面的时候看到,当时做支付时候的一些散落的笔记,就稍微整理一下,给大家分享一下. 第一:当时调用支付宝的时候,总是调不起来,进过断点 ...
- Eureka 微服务注册中心搭建
本机IP为 192.168.1.102 1. 新建Maven项目 eureka 2. pom.xml <project xmlns="http://maven.apach ...
- 对象 -----JavaScript
本文摘要:http://www.liaoxuefeng.com/ JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成. JavaScript的对象用于描述现实世界中的某个对象.例如 ...
- linux 环境能变量配置
1, 3.配置环境变量 在/etc/profile文件末尾中添加以下环境变量:(我上面的JDK目录是jdk1.6.0_45,所以下面JAVA_HOME中也是这个) export JAVA_HOME=/ ...
- cf540D. Bad Luck Island(概率dp)
题意 岛上有三个物种:剪刀$s$.石头$r$.布$p$ 其中剪刀能干掉布,布能干掉石头,石头能干掉剪刀 每天会从这三个物种中发生一场战争(也就是说其中的一个会被干掉) 问最后仅有$s/r/p$物种生存 ...
- 数据结构(C语言)分享笔记:数据结构的逻辑层次、存储层次
[1] 严格意义上数据结构的概念 数据结构,一个简单的定义:相互之间存在一种或多种特定关系的数据元素的集合.即:数据结构 = 元素集合 + 元素间关系的集合 . 在讨论数据结构时,可以基于两个不同的层 ...
- Java 对数组的筛选
在Java里面 一般对一个数组进行筛选,去剔除一些元素,一般做法是用临时数组来存储,把符合条件的元素加入到新数组中,虽然数组有移除的方法但是 是线程不安全的: 而用迭代器Iterator,可以在遍历的 ...