【转】一个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 提供很多强大的功能,可以帮助实现 ...
随机推荐
- Head First HTML与CSS阅读笔记(二)
上一篇Head First HTML与CSS阅读笔记(一)中总结了<Head First HTML与CSS>前9章的知识点,本篇则会将剩下的10~15章内容进行总结,具体如下所示. div ...
- form.elements属性
form.elements属性与childNodes属性不同的是form.elements只返回的是表单元素组成的数组,包括input,textarea等
- [转载]AngularJS入门教程00:引导程序
我们现在开始准备编写AngularJS应用——phonecat.这一步骤(步骤0),您将会熟悉重要的源代码文件,学习启动包含AngularJS种子项目的开发环境,并在浏览器端运行应用. 进入angul ...
- UVA Mega Man's Mission(状压dp)
把消灭了那些机器人作为状态S,预处理出状态S下可以消灭的机器人,转移统计方案.方案数最多16!,要用64bit保存方案. #include<bits/stdc++.h> using nam ...
- oc引用计数原理-引用计数相关变化
http://blog.csdn.net/null29/article/details/71191044 在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实 ...
- Java不同对象之间复制属性
// 导入包import org.springframework.beans.BeanUtils; /** * 调用工具复制2个对象之间的属性 2个JavaBean对象复制的属性名相同 * @para ...
- 事件流,事件对象和jQuery
事件流 多个彼此嵌套元素,他们拥有相同的事件,最内部元素事件被触发后,外边多个元素的同类型事件也会被触发,多个元素他们同类型事件同时执行的效果称为“事件流” 例子:html代码: <div cl ...
- 转载:jsonp详解
json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西.今天总算搞明白了.下面一步步来搞清楚jsonp是个什么玩意. 同源策略 首先 ...
- (SSO)单点登录原理和总结
一:什么是单点登录(single Sign-On) SSO 是一种统一认证和授权机制,指访问统一服务器不用应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后, 再访问其他应用中 ...
- jstl(c)标签
一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java 代码 ...