网络斗地主服务端项目文档.docx
《网络斗地主服务端项目文档.docx》由会员分享,可在线阅读,更多相关《网络斗地主服务端项目文档.docx(27页珍藏版)》请在冰豆网上搜索。
网络斗地主服务端项目文档
安卓项目组
2012/01/06
V1.0
文档版本记录
版本号
修改日期
作者
更改说明
V1.0
2012/01/06
史进鹏
文档创建
0阅读说明
黑色粗体表示需要重点阅读,蓝色代表MINA框架类的方法,红色代表类名。
文档分4个部分:
(1)1-5牌类游戏服务端基类;
(2)6-8继承第一部分基类,定义斗地主游戏服务端主要的类,并在这些类中定义了处理消息队列线程需要的方法
(3)9-12定义第二部分类的数据管理13数据库数据初始化到内存的方法类
(4)服务端交互部分,14-19是MINA服务端监听接收,发送,编解码;20-23创建4个线程对交互数据的处理;24-27定义
把不同的协议归成属于哪些服务类,规范处理。
1房间Room类
(1)属性
房间名称、房间类型、房间内桌子的数量、房间内的桌子列表、房间内的在线人数
(2)方法
构造方法:
构造器默认构造
获取房间名称方法
参数:
无返回值:
房间名称
设置房间名称方法
参数:
房间名称返回值:
无
获取房间类型方法
注释:
获取房间类型(如:
新手场、中级场、高级随意配桌)参数:
无返回值:
房间类型
设置房间类型方法
参数:
房间类型返回值:
无
获取房间内桌子数量的方法
参数:
无
返回值:
房间内桌子的数量
g设置房间内桌子数量的方法
参数:
桌子的数量
返回值:
无
h获取房间内桌子列表的方法
参数:
无
返回值:
房间内桌子列表
i设置房间内桌子列表的方法
参数:
桌子的列表
返回值:
无
j获取房间内在线人数的方法
参数:
无
返回值:
房间内的在线人数
k设置房间内在线人数的方法
参数:
在线人数
返回值:
无
l进入房间时添加在线人数的方法
注释:
进入房间添加在线人数,并且同一时间只能有一个线程执行此操作
(synchronized修饰)
参数:
无
返回值:
无
m退出房间时减少在线人数
注释:
退出房间减少在线人数,并且同一时间只能有一个线程执行此操作
(synchronized修饰)
参数:
无
返回值:
无
n自动分配到桌子方法(子类中会实现)
注释:
为玩家自动分配到一张桌子
参数:
一个玩家的对象
返回值:
分配到的桌子(null)
2桌子Table类
(1)属性
桌子所属房间ID、桌子名称(现在没用后面可能会用到)、桌子
ID、桌子当前用户数、
桌子允许的最大用户数、桌子状态、用户列表(考虑用户数量不确定性用vector)、消息队列
(2)方法
构造方法:
构造器默认构造
设置桌子所属房间的方法
注释:
就是设置所在房间的房间类型,是新手场,中级场还是其他类型房间。
返回值:
无
获取桌子所属房间的方法
注释:
可在斗地主桌子类的换桌方法中使用,使玩家只能在同一房间内换桌参数:
无返回值:
得到桌子所属房间的ID
设置桌子名称的方法
注释:
在初始化桌子信息时把桌子名称设置成桌子ID的字符串
参数:
桌子名称返回值:
无
获取桌子名称的方法
参数:
无返回值:
得到桌子名称
设置桌子ID的方法
返回值:
无
获取桌子ID的方法
注释:
用于在玩家成功进入桌子后,发送消息告诉玩家进入的是几号桌子参数:
无返回值:
得到桌子ID
设置桌子用户数的方法
注释:
只为当玩家退出或者进入桌子时要设置一下桌子的当前用户数,私有方法。
进入和退出桌子的方法已经加了线程保护
synchronized,所以此方法就不用加线程保护。
参数:
桌子用户数返回值:
无
i获取桌子用户数的方法
注释:
在斗地主桌子类中给玩家找桌子的方法中会用到,主要配合方法k判断当前桌子玩家数有没有满
参数:
无返回值:
得到桌子用户数
j设置桌子允许最大用户数的方法
注释:
在初始化桌子信息时,可根据游戏不同传入不同的参数参数:
桌子允许最大用户数返回值:
无
k获取桌子允许最大用户数的方法
注释:
主要用来判断当前桌子玩家数有没有满参数:
无返回值:
得到桌子允许最大用户数
I设置桌子状态的方法
注释:
如准备中、叫分中、玩牌中参数:
桌子的状态返回值:
无
获取桌子状态的方法
参数:
无返回值:
得到桌子的状态
设置桌子用户列表的方法
注释:
在桌子初始化时,给每个桌子加一个包含三个空对象的用户列表参数:
桌子的用户列表返回值:
无
获取桌子用户列表的方法
注释:
得到一个桌子的用户列表,便于遍历桌子中的每个玩家参数:
无返回值:
得到桌子的用户列表
设置桌子消息队列的方法
注释:
初始化桌子信息时,每个桌子对象都会new—个消息队列,所以这个方法一般不会用到参数:
桌子的消息队列返回值:
无
获取桌子消息队列的方法
注释:
获取到桌子的消息队列,可使用队列的add方法添加消息。
参数:
无
返回值:
得到桌子的消息队列
将收到的消息加入到桌子的消息队列中
注释:
将消息加入到桌子的消息队列中,会被处理所有桌子消息队列的线程MessageThread处理
参数:
消息类型、消息对象
返回值:
无
实现过程:
1>创建一个消息队列单元类型MessageUnit的对象unit
2>把参数消息类型和消息对象打包到unit中
3>调用方法q得到消息队列对象,用消息队列对象的添加方法,把unit添加到消息队列中
给桌子的玩家列表中的每个玩家发送消息的方法
参数:
消息类型、消息对象
返回值:
无
玩家进入桌子的处理(同一时刻只能有一个线程执行此操作)
注释:
被斗地主房间类中找桌子的方法调用(找桌子的方法是先找有2人的桌子,再找有1人的桌子,最后找无人的桌子)
参数:
玩家对象
返回值:
是否进入成功
实现过程:
传入一个玩家对象,判断桌子是否有空位(被找桌子的方法调用时此判断无用),有空位则遍历桌子用户列表中为
空的玩家给替换掉进入成功,否则进入失败
玩家退出桌子的处理(同一时刻只能有一个线程执行此操作)
注释:
玩家退出桌子后对桌子的处理
参数:
玩家对象
返回值:
无
实现过程:
遍历桌子的玩家列表,取得每个玩家的用户名与参数的用户名比较,把相同的置空,减少桌子的用户数
进入桌子所属的房间
注释:
玩家进入桌子所属的房间后的处理
参数:
无
返回值:
无
实现过程:
通过方法b获取得到桌子所属的房间ID,来增加当前房间的人数
退出桌子所属的房间:
注释:
玩家退出桌子所属的房间后的处理
返回值:
无实现过程:
通过方法b获取得到桌子所属的房间ID,来减少当前房间的人数并且移除此用户
开始游戏:
参数:
无返回值:
无
结束游戏:
参数:
无返回值:
无
同步信息:
参数:
无返回值:
null
aa超时处理:
参数:
无返回值:
无
3玩家Player类
⑴属性
用户名、玩家交互、所属的桌子(可能没有桌子),用户ID,昵称
(2)方法
a构造方法:
构造器默认构造
b发送给当前玩家消息的方法
注释:
在子类中会被重载,暂无定义参数:
无返回值:
无
设置当前用户名的方法
注释:
设置当前用户名
返回值:
无
获取当前用户名的方法
注释:
获取当前用户名参数:
无返回值:
用户名
设置当前玩家交互的方法
注释:
设置当前玩家的交互参数:
用户交互实例(被服务端用来识别用户)返回值:
无
获取当前用户交互的方法
注释:
获取当前玩家交互实例参数:
无返回值:
当前玩家交互实例
设置当前用户所在的桌子方法
注释:
设置当前用户所在的桌子参数:
当前用户所在的桌子返回值:
无
获取当前用户所在的桌子的方法
注释:
获取当前用户所在的桌子参数:
无返回值:
用户所在的桌子
i设置当前用户ID的方法
注释:
标记客户端,服务端数据也应该以此为用户信息表的主键参数:
当前用户ID返回值:
无
j获取当前用户ID的方法
注释:
标记客户端,服务端数据也应该以此为用户信息表的主键参数:
无
返回值:
用户ID
k设置当前用户昵称的方法
参数:
当前用户ID返回值:
无
l获取当前用户昵称的方法
参数:
无返回值:
用户ID
4牌Card类
⑴属性
面值、花色、权值
(2)方法
构造方法1
注释:
初始化牌的面值、花色和权值(权值默认初始化为1)
返回值:
无
构造方法2
注释:
初始化牌的面值、花色和权值(按传入的参数初始化权值)
参数:
数值、花色、权值返回值:
无
获取牌面值的方法
注释:
获取牌的面值参数:
无返回值:
面值
获取牌花色的方法
注释:
获取牌的花色参数:
无返回值:
花色
获取牌权值的方法
注释:
获取牌的权值参数:
无
返回值:
权值
f设置牌权值的方法
注释:
设置牌的权值参数:
权值返回值:
无
5牌组CardArray类
⑴属性
牌组中牌的张数、牌对象的数组、牌组的权值
(2)方法
a构造方法1
参数:
牌组中牌的张数、牌对象的数组返回值:
无
构造方法2
注释:
初始化牌的张数、牌对象的数组、
(按传入的参数初始化牌组的权值)
参数:
牌组中牌的张数、牌对象的数组、返回值:
无
<3>构造方法3
返回值:
无
构造方法4
参数:
无返回值:
无
获取牌组中牌的张数方法
注释:
获取牌组中牌的张数参数:
无返回值:
牌组中牌的张数
获取一个排序后的全部数值数组1
注释:
获取一个排序后的全部数值数组(默认按照面值递增排序)参数:
无返回值:
一个排序后的牌组
f获取一个排序后的全部数值数组2
注释:
获取一个排序后的全部数值数组(按照传入参数方式排序)参数:
排序方式(面值正排序1、面值逆排序2、权值大小正排序3或权值大小逆排序4)返回值:
一个排序后的数值数组
g添加牌对象1
注释:
添加牌对象
返回值:
一个添加后的牌组
h添加牌对象2
注释:
添加牌对象的数组参数:
牌对象的数组返回值:
一个添加后的牌组
i删除牌对象1
注释:
删除牌对象
返回值:
删除后的数值数组
j删除牌对象2
注释:
删除牌对象的数组参数:
牌对象的数组返回值:
删除后的数值数组
k比较面值是否相同1
注释:
比较数值是否相同
返回值:
是否相同
I比较面值是否相同2
注释:
比较数值是否相同参数:
牌对象的数组返回值:
是否相同
m比较数值是否相同3
注释:
比较数值是否相同参数:
牌组类的对象返回值:
是否相同
比较数值是否包含1
注释:
比较牌对象数值是否包含
返回值:
是否包含
比较数值是否包含2
注释:
比较牌对象的数组的数值是否包含参数:
牌对象的数组返回值:
是否包含
比较数值是否包含3
注释:
比较牌类对象的数值是否包含参数:
牌组对象返回值:
是否包含
是否清一色
注释:
比较牌对象是否相同花色参数:
无返回值:
是、否
获取牌组对象的权值
注释:
获取牌组对象的权值参数:
无返回值:
牌组对象的权值
设置牌组对象的权值
注释:
设置牌组对象的权值参数:
无返回值:
无
比较牌组对象权值的大小
注释:
比较牌组对象权值的大小参数:
要比较的牌组对象的权值
返回值:
1(大于)、0(等于)、-1(小于)
//斗地主游戏框架
6斗地主房间RoomDdz3类
继承Room类
(1)属性
房间底注
(2)方法
构造方法:
构造器默认构造
设置斗地主房间底注的方法
注释:
设置斗地主房间底注参数:
要设置的底注的值返回值:
无
获取斗地主房间底注的方法
注释:
获取斗地主房间底注参数:
无返回值:
房间底注
重写父类自动分配桌子的方法
注释:
给玩家找到一个有位置的桌子,先找已经有2人的桌子,如果没有再找已经有1人的桌子,如果没有再找已经有0人的
桌子,如果没有则返回null参数:
玩家对象返回值:
分配到的桌子实现过程:
调用找桌子方法
找桌子的方法
参数:
桌子的人数,玩家对象返回值:
找到的桌子
7斗地主桌子TableDdz3类
继承Table类
(1)属性
桌子底注、倍数、谁是地主、最高分数、叫分次数
当前操作人、当前出的牌、牌型、用户的牌(MaP)
已准备的人数、叫分人、上一轮出的牌(MaP)、炸弹
春天、时间、时间限制、不出次数
(2)方法
构造方法
注释:
初始化属性’用户的牌'
、’上一轮出的牌’为<用户名,牌组>
初始化倍数默认为1.
准备游戏
注释:
线程MessageThread
处理准备游戏时调用此函数
参数:
玩家状态,玩家对象返回值:
无
叫分
参数:
叫分的消息包,玩家对象返回值:
无
不叫分
注释:
线程MessageThread处理不叫分时调用此函数参数:
叫分的消息包,玩家对象返回值:
无
出牌
注释:
线程MessageThread处理出牌时调用此函数参数:
出牌的消息包,玩家对象返回值:
无
换桌
注释:
线程MessageThread处理换桌时调用此函数参数:
快速游戏的消息包,玩家对象返回值:
无
托管/取消托管
注释:
线程MessageThread处理托管/取消托管时调用此函数参数:
托管的消息包,玩家对象返回值:
无
退出游戏
注释:
线程MessageThread处理退出游戏时调用此函数
参数:
退出游戏的消息包,玩家对象返回值:
无
i打牌结果处理
注释:
线程ResultThread处理打牌结果时调用此函数参数:
斗地主玩家对象,玩家列表,斗地主桌子对象返回值:
无
j计算金币
注释:
线程ResultThread处理打牌结果时调用此函数参数:
斗地主桌子对象,用户名,结果消息包,是否赢,是否是地主返回值:
结果消息包
k开始游戏
注释:
线程ResultThread处理打牌结果时调用此函数,包括调用洗牌发牌,随机叫分方法参数:
无返回值:
无
l游戏结束
注释:
重置斗地主桌子属性和玩家列表参数:
无返回值:
无
m离开游戏
参数:
玩家对象返回值:
无
n斗地主桌子属性的获取和设置方法
8斗地主玩家PlayerDdz3类
继承Player类
⑴属性
金币数、角色名称、胜数、输数、
状态、得分、叫分、是否是地主、
是否准备、打牌超时次数、操作时间、
托管、打牌次数
(2)方法
构造方法:
构造器默认构造
发送消息给自己
参数:
消息类型,消息对象
返回值:
无
斗地主玩家属性的获取和设置
//游戏数据
9数据库连接池管理类DbManager
创建连接数据库的方法
⑴属性
数据源
(2)方法
初始化
注释:
读取配置文件,获取数据库的位置,连接用户名和密码等信息,并加载到数据源。
参数:
无返回值:
无
加载配置信息的方法
注释:
把配置信息加载到数据源参数:
要加载的信息实例返回值:
无
同步配置信息的方法
注释:
如果数据源为空,就重新加载参数:
无返回值:
无
修改保存的方法
注释:
修改数据库内容并保存参数:
数据库名,要修改内容对象返回值:
修改结果
获取与数据库的连接实例的方法
参数:
无返回值:
得到数据库连接的实例
关闭与数据库的连接实例的方法
参数:
数据库连接的实例返回值:
无
10房间数据库管理方法类RoomDao:
(1)属性:
无
(2)方法:
a加载数据库中房间信息的方法
注释:
根据游戏类型获取数据库中的房间信息加载到每个新建的房间对象中参数:
游戏类型(三人斗地主或者其他)返回值:
加载好的房间列表
b加载数据库中用户的信息
注释:
根据用户名获取数据库中的用户信息加载到每个新建的用户对象中
返回值:
加载好的用户对象
11任务数据库管理方法类TaskDao
(1)属性:
任务数据库管理方法类实例
(2)方法:
构造方法:
空
获取任务数据库管理方法类实例
参数:
无返回值:
得到任务数据库管理方法类实例
新建一个任务数据库管理方法类实例
参数:
无返回值:
无
获取任务列表
参数:
无返回值:
任务列表
检测任务是否完成
参数:
任务类型,用户名
返回值:
完成或未完成
查询用户的任务列表
参数:
任务类型,用户名
返回值:
完成或未完成
参数:
一组用户名
更新任务列表
参数:
打牌结果处理包实例
返回值:
无
属性:
无
方法:
a添加一个用户
参数:
用户信息包实例返回值:
无
b验证用户是否注册(暂时不用)
参数:
用户信息包实例返回值:
存在或不存在
c用户登录验证(暂时不用)
包括金币,输数,赢数,等级和网名
注释:
在登录成功后就新建个用户信息包来保存当前数据库中的用户信息。
参数:
用户信息包实例返回值:
用户详细信息实例
13数据库数据初始化到内存的方法类
(1)属性
定义一个房间列表的引用(用来只想新建的房间列表)roomList
(2)方法:
a、初始化房间到内存方法
注释:
初始化房间信息,桌子信息和每个桌子一个空用户列表参数:
无返回值:
无实现过程:
<1>从数据库中加载出房间列表实例给被roomList弓I用
<2>根据房间信息新建桌子对象并加入到一个桌子列表中,set到房间对象中<3>新建桌子对象时新建一个用户对象为空的用户列表给桌子对象
b、设置房间列表引用的方法
参数:
房间列表引用返回值:
无
C、获取房间列表引用的方法
参数:
无返回值:
房间列表引用
//MINA交互框架
14服务启动Server类
(1)属性
端口号
(2)方法:
a构造方法:
构造器默认构造
b初始化服务端配置方法:
bindServer
注释:
初始化服务端配置参数:
无返回值:
无实现过程:
1>初始化了服务端的TCP/IP的基于NIO的套接字2>然后调用IoSessionConfig设置读取数据的缓冲区大小3>读写通道均在10秒内无任何操作就进入空闲状态
4>使用MINA为我们提供的编解码器工厂来对字符串进行编解码处理,组装编解码器
EncoderBeanBaseMessageEncoderBaseMessageDecoder三个类
5>注册ServerHandler处理dient传过来的数据6>绑定端口号
c服务端启动的入口函数:
main
注释:
服务端启动参数:
输入行参数args返回值:
无
实现过程:
15编码包类EncoderBean类
发送消息时将要发送的信息放入EncoderBean类对象中
(1)属性
编码类型(有默认编码类型)、要编码的内容、自定义编码类型
(2)方法
构造方法:
构造器默认构造
获取编码类型的方法:
注释:
获取编码类型参数:
无返回值:
编码类型
设置编码类型的方法:
注释:
设置编码类型参数:
编码类型返回值:
无
d获取要编码内容的方法:
注释:
获取要编码的内容参数:
无返回值:
编码的内容
e设置要编码内容的方法:
注释:
设置要编码的内容参数:
编码的内容返回值:
无
f获取自定义编码类型的方法:
注释:
获取自定义编码类型参数:
无返回值:
自定义编码类型
g设置自定义编码类型的方法:
注释:
设置自定义编码类型参数:
编码类型返回值:
编码类型
16编码打包方法类BaseMessageEncoder类
发送消息写入缓冲区实例之后将调用此类中的encode函数
(1)属性:
无
(2)方法:
a构造方法:
构造器默认构造
b编码方法encode:
注释:
把写入到缓冲loBuffer中的编码包类对象编码并发送
参数:
session实例、编码包对象、encode输出方法类对象
返回值:
无
17解码方法类BaseMessageDecoder类
收到client数据后调用此类中的decode方法解包
(1)属性:
定义一个保存在IoSession中的对象的键值
(2)方法:
a构造方法:
构造器默认构造
b判断是否可解码的方法:
decodable
注释:
是否可解码参数:
当前session实例,输入缓冲buffer实例返回值:
是否可解码
c解码的方法:
decode
注释:
对收到的数据解码参数:
session实例,输入缓冲buffer实例,decode输出方法类实例返回值:
解码结果(解码完成、还需要数据)
18服务端处理数据ServerHandler类
(1)属性:
无
(2)方法:
构造函数
注释:
注册StringHandler处理client传过来的数据参数:
无
发送消息的方法:
sendBeanMsg
注释:
把要发送的消息实例和协议传入,然后发送参数:
session实例,协议值,消息对象返回值:
无实现过程:
1>创建数据包PackData类的对象2>把传入的参数协议值和消息对象set到packdata对象中3>调用方法发送消息方法写入IoBuffer缓冲区
发送消息方法:
sendMsg
注释:
把消息对象参数解释成json的String,再由参数session对象的write方法写入缓冲区,框架会调用enconde函数将缓冲区内的buffer编码打包并发送。
参数:
session实例,消息对象返回值:
无实现过程:
1>创建编码对象bean2>把消息对象参数解释成json的String,打包到编码对象bean中3>再由参数session对象的write方法把bean写入缓冲区,由框架调用encode编码发送。
19服务端处理数据StringHandler类
(1)属性:
用户服务类对象,房间服务类对象,桌子服务类对象,聊天服务类对象
注释:
目前将接收到的数据分成这4类来处理,用户服务类单独提出来提供测试使用的注册和登录服务,房间服务类单独提
出来提供测试使用的游戏大厅的服务
(2)方法:
a处理客户端发来的数据handleMessage
注释:
客户端发来数据经解码后由ServerHandler发过来,此功能就是从数据中找到消息类型(即协议),根据不同的数据类
型执行对应的操作。
参数:
当前交互实例,消息实例返回值:
无
实现过程:
<1>把传过来的json型String对象转成数据包类型PackData类对象<2>使用数据包PackData类的获取数据类型的方法得到数据类型<3>根据不同的数据类型选择不同的执行方法
//游戏交互数据处理
20心跳线程HeartBeatThread类
(1)属性:
无
(2)方法:
a构造函数:
构造器默认构造
b线程运行函数:
注释:
客户端会持续发送心跳包,服务端接到解码处理后会为此交互设置一个时间点(查看StringHandler),线程反复的把
此交互的最新的时间点和当前时间比较,超时则发送消息告诉桌子此用户已掉线并删除此用户(这个操作还需完善)
参数:
无返回值:
无
21计时线程CounterThread类
(1)属性:
定义一个房间列表的引用指向已经初始化的房间列表的实例
(2)方法:
a构造函数:
构造器默认构造
b线程运行函数:
注释:
循环遍历每个房间的每张桌子的状态,针对每种状态做计时处理。
准备中状态(默认),踢出超时玩家;叫分中状态,
超时提示下家叫分;玩牌中状态超时一次自动出牌,超时多次托管出牌。
参数:
无返回值:
无
c处理准备中桌子的方法:
注释:
把进入桌子准备中超时的玩家踢出
22处理桌子消息队列线程MessageThread类
(1)属性:
无
(2)方法:
a构造函数:
构造器默认构造
b线程运行函数:
注释:
遍历每个房间的每个桌子的消息队列,根据消息类型做不同处理参数:
无返回值:
无
23处理显示结果线程ResultThr