包包版网络游戏大厅+桥牌系统 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通信、异步机制、序列化等多门技术。

 

posted @ 2008-07-19 08:47 包建强 阅读(2529) 评论(13)  编辑 收藏 所属分类: 包包版网络棋牌大厅

  回复  引用    
#1楼 2008-07-19 18:24 | daoyuly [未注册用户]
期待包哥的桥牌作品,希望开源哦.....
  回复  引用  查看    
#2楼 [楼主]2008-07-19 18:26 | 包建强      
@daoyuly
早就开源的了,我可不指望这个赚钱。
  回复  引用  查看    
#3楼 2008-07-19 20:53 | WilsonWu      
支持老包!!!!!!!!!!!!!

  回复  引用    
#4楼 2008-07-19 21:45 | yxsan@126.com [未注册用户]
半年前研究了它一周时间,还是会遇到一些网络通信的问题。客户端与服务端调试也不是很方便。就不知道其他人用的怎么样了?
  回复  引用  查看    
#5楼 2008-07-19 21:53 | 笑疯^_^      
期待下文!~~~~~
  回复  引用    
#6楼 2008-07-19 22:37 | daoyuly [未注册用户]
呵呵,不好意思,没看你的前序文章。现在找到源码了,谢谢包哥!
  回复  引用    
#7楼 2008-07-19 22:53 | daoyuly [未注册用户]
如果突然断电isLogin怎么设置呢?
  回复  引用  查看    
#8楼 [楼主]2008-07-19 23:01 | 包建强      
@daoyuly
后文会介绍.
Client断电,Server会抛出异常,从而认为他离线,isLogin设为0。
Server断电,这个我还真没想过。

  回复  引用  查看    
#9楼 2008-07-20 18:58 | 丁学      
你那个isLogin的char(1)看着不爽啊,这个一般不需要扩展,所以使用个bit就好了,程序还比char的好写一些,省得你在程序中还得创建新字符串"1"去比较,如果要扩展,int也好过char
  回复  引用  查看    
#10楼 2008-07-20 19:00 | 丁学      
还有那个port,怎么想都不应该是varchar类型的
  回复  引用    
#11楼 2008-07-21 13:52 | pengpai01 [未注册用户]
开源地址在哪里,能否加个链接
  回复  引用    
#12楼 2008-07-21 17:05 | 历史罪人 [未注册用户]
从来没有找到楼主的源码..鄙视一下
  回复  引用  查看    
#13楼 [楼主]2008-07-21 17:21 | 包建强      
@pengpai01
开源地址参见此文:
http://www.cnblogs.com/Jax/archive/2008/07/05/1236246.html

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-31 18:34 编辑过


相关链接:

历史上的今天:
2007-07-19 SharpDevelop使用心得