包包版网络游戏大厅+桥牌系统 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通信、异步机制、序列化等多门技术。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2007-07-19 SharpDevelop使用心得