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