包包版网络游戏大厅+桥牌系统 2.游戏大厅的基本架构
我对这个项目的规划如下图:
其中,PlayCardClient和PlayCardServer这两个项目分别代表Client端和Server端。一般而言,Server端都使用Console控制台来显示信息,对于两年前这个新手而言,我使用了Winform,从而看的更清晰一些,而且,新版本我也不准备改了,因为Server端的逻辑非常简单——只负责通信,以及操作数据库。
CommonClassLibrary是一个类库,Server端和Client端都依赖于这个类库(添加对这个类库的引用)。这个类库中,存放着自定义的通信协议,TCP Socket的自定义信道,以及Client端和Server端都要使用的实体类,
TestProject这个项目用来进行一些Component的研究试验,比如说发牌程序、摆牌控件等等。我没有建立单元测试的项目,话说,这可不是一个好的习惯,但是我两年前却是不懂NUnit这套技术。
对数据库的规划,在这个项目中,我对数据库的要求是:
负责验证登陆,登陆后取出用户信息
牌局结束后,改变数据库中用户Score字段
*至于其他的数据,都保存在Server端的内存中。
于是,我的数据库设计如下:
其中,每个字段都要说说,因为涉及到很多业务逻辑:
UserID是登陆名(主键),UserName是显示昵称。
isLogin,表示用户是否已经登陆,1为是,0为否,登陆后这个字段改为1,离开大厅后则改为0,这就防止一个用户名多处同时登陆的问题。
ImageIndex,表示用户的头像,是一个整数,与Client端的图片库的图片名称一一对应。
Score,记录用户的分数,每局结束后,都会更改这个字段。
Port,这个字段用来记录用户的端口。话说,设计这个字段,我也是无奈之举,是为了限制用户作弊,在同一台机器上同时登陆两个账号。可当时我只有一台开发机器,这样做就无法模拟四个不同的用户了,我又不想安装虚拟机,于是我就加了端口这个字段,在添加每个用户的同时,为他们指定不同的端口号,这样在一台机器上同时登陆4个用户,程序就可以认为是不同机器上的用户了。
原计划,用户注册做在Web界面中,只是我后来没有做这个网站,于是手动添加5个用户如下(见下面这条SQL抓出来的记录):
相应的,在Server端的数据库操作只有3个静态方法,位于DB这个类中,分别是:
1)Login
在用户登录时,调用此方法进行验证。注意,如果登陆前isLogin字段为1,那么将导致登陆不成功。
2)UpdateStatus
如果登陆成功,将isLogin字段由0改为1;用户离线抛出异常时,将isLogin字段由1改为0。
3)UpdateScore
牌局结束后,根据UserID改变相应分数。
好吧,准备工作基本完成,下面就要开始我们的第一步,建立游戏大厅的通信机制。这就涉及到多线程、TCP Socket通信、异步机制、序列化等多门技术。