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