1、本科毕业设计(论文)基于Unity3D多平台网络斗地主的设计与实现学院名称: 计算机工程学院 专业:计算机科学与技术 班级: 10工程W学号:10141303姓名:丁小未 指导教师姓名: 朱明放 指导教师职称: 副教授 二一四 年 五 月江苏理工学院毕业设计说明书(论文)基于Unity3D的多平台网络斗地主的设计与实现摘 要:斗地主是一款非常经典的游戏,可以说是家喻户晓,玩法也比较的简单,娱乐性也比较强,老少皆宜.随着互联网技术的飞速发展,斗地主呈现的形式也变得多样性,由传统的纸牌游戏衍生为移动端单机游戏,然后到多人多平台的即时在线联网游戏。形式的变化能够让人足不出户也能感受到和伙伴们一起玩游
2、戏的乐趣.本设计的游戏规则是针对一副牌为准,本文论述了网络斗地主游戏的基本算法设计以及大体的设计框架和思路,并且以图文,部分核心代码解释的形式展示出来。本设计采用了Unity3D作为开发引擎,结合Visual studio 2010开发工具,通过基本的socket通讯和一些算法,最终实现了多平台的多人网络斗地主的设计。本文基于Unity3D的游戏开发设计过程中,采用了MVC的设计模式,这也符合Unity3D工作模式;采用C脚本语言也更符合Unity3D游戏设计面向对象的设计理念,游戏设计就是将面向对象这一特性发挥到极致;采用MONO开源跨平台框架能够大大节约游戏的开发效率以及开发成本,最后通过
3、实际的完成效果来验证了基于Unity3D的多平台网络斗地主游戏设计具有高效性,高品质和低门槛性的特点。关键词:Unity3D,斗地主,手机游戏,游戏引擎,socket,网络通讯,MVC,MONODesign and implementation of multi-platform network LandlordsBased Unity3DAbstract: Landlords is a classic game, which can be said to be a household name。 The rules are relatively simple,and kind of the
4、entertainment is relatively strong. As a result, the game has gain popularity among both the young and the old。 With the rapid development of Internet technology, the form of the game is of greatdiversity。 The game derived from the traditional card game, thenturned into the stand-alone mobile phone
5、game, and now has become a multi platform instant online multiplayer networked game. The changes in the game form make people who stay at home enjoying the fun of playing the game together。The design of the rules is accordingto a deck of cards。 The article discusses the basic network Landlords algor
6、ithm design and the general framework and ideas of the game. The game interprets itself successfully by the graphic form and thepart of the core code。 This design uses the Unity3D as a development engine. Besides, it combined with Visual studio 2010 development tools. Ultimately we finishthe design
7、of a multi -platform multiplayer online Landlords by some algorithms and the basic socket communication.The article is based on the design process of Unity3D game development。 The MVC design patternis consistent with Unity3D mode, and C scripting language is good forthe design objectoriented design
8、of Unity3D game. Objectoriented game design is supposed to make the best of the feature .The MONO open source framework can greatly reduce the efficiency of game development as well as development costs. Finally we validate the high efficiency, high quality and lowthreshold characteristics of the mu
9、ltiplatform network game which based on Landlords Unity3D byachieving the actual results。Keywords:Unity3D, Landlords, mobile games, game engine, socket, network communications, MVC, MONO2目录前言1第1章概述21.1 系统开发背景21。2 设计的目的31。3 设计的意义3第2章开发环境及相关技术介绍42.1 开发环境介绍42.1。1 Unity3D简介42。1。2 Visual Stdio2010和MonoDe
10、velop52.1.3 Xcode简介52。2 C#语言和Javascript脚本62.2。1 C语言62.2。2 Javascript语言62。3 IOCP框架简介72.3。1 IOCP内部工作队列图72.3。2 程序实现IOCP模型的基本步骤82。3。3 使用IOCP模型和不使用IOCP模型通讯的对比82.4 本章小结10第3章系统需求分析103。1 用户功能需求分析103.2 系统性能要求103.3 可行性分析10第4章总体方案设计114。1 纸牌设计114。1.1 牌型设计114。1。2 出牌类型(游戏规则)设计124。2 C/S模式124。2.1 基于C/S模式的服务器端设计流程图1
11、24.2。2 基于C/S模式的客户端设计流程图124。3 游戏逻辑程序结构134.3。1 数据层134。3.2 控制层134。3。3 显示层144。4 游戏设计流程图144。5 数学建模15第5章详细设计与系统实现165。1 斗地主洗牌算法165。2 斗地主之“排序”算法165。3 基于IOCP的Socket通讯185.4 User对象的设计195。4.1 玩家状态设计195.4。2 玩家的属性以及手牌的操作方法205。5 Table对象的设计215。5.1 桌子状态设计215。5.2 Table的属性及方法215.6 粘包问题235.6.1 TCP和UDP的介绍以及区别235。6。2 粘包介
12、绍及处理23第6章发布和测试256。1 服务器端性能检测256.2 打包发布Android应用276.2。1 导出Android设置276.2.2 真机效果图286.3 打包发布IOS应用296.3.1导出IOS设置296。3.2真机效果图316.4打包发布Web应用326。4。1 关于UnityWebPlayer的SandBox Security(安全沙盒机制)326.4。2 导出Web设置326.4.3 运行结果336。5 打包发布PC/Linux应用346。6 整体测试效果34结束语40致谢42参考文献43附录A 网络斗地主的游戏规则44附录B 部分程序代码47III前言近年来,随着科技
13、和互联网的飞速发展、智能手机的迅速普以及性能的不断提升,游戏行业也突飞猛进,游戏已经逐渐成为人们公认的第九种艺术。现在各个平台上的游戏逐渐涌现,从最初的红白机,到PC机再到XBox平台发展到如今的手机移动平台,从端游到页游再到手游甚至是体感游戏等表现形式也逐渐丰富,当然成功的也数不胜数。比较大型的游戏有:反恐精英、星际争霸、使命召唤,生化危机等.当然也涌现了诸多经典的网络小游戏,比如麻将、拖拉机、中国象棋等。此外手机游戏,如愤怒的小鸟、保卫萝卜、FlappyBird、切水果、捕鱼达人等也赢得许多人的青睐.这些各种各样形式的游戏给如今生活在网络时代的人们带来了无限的生活乐趣。斗地主是一款相当经典
14、的游戏,当然前人也做了不少版本,有移动端,pc端甚至是Web端的。可能他们在设计的过程中只是正对某一平台然后使用特性的开发技术来开发,这样的话如果想要实现多平台的设计就需要极大的时间成本和劳力成本.而Unity3D引擎的问世,最大的解决了这一问题,它能够实现一次开发多平台发布的特点,这也是为什么Unity3D引擎在短暂的时间里能够发展的如此迅速的原因。将斗地主游戏从单机版到网络化,使得现实中的多个玩家能够在同一个虚拟房间里面进行对局,并且能够实时的聊天,同时还不会受到平台的限制,你可以选择pc,web或者是移动端,从而能更好的体验游戏,娱乐生活。第1章 概述1.1 系统开发背景随着Unity3
15、D引擎的横空出世,游戏开发技术也变得越来越成熟,这款引擎也逐渐改变了整个游戏圈的开发格局,之前火遍了全球的神庙逃亡就是基于Unity引擎开发的一款比较成功的手游大作,这也更很好的证明了Unity作为一款游戏引擎还是值得开发者的信赖。Unity相比较之前大家都熟悉的Unreal虚幻引擎,我认为Unity做的更好,它最值得人称赞的就是它的跨平台性是其他游戏引擎无法匹敌的,Unity能够做到一次编写多平台发布,能够大大节省了项目开发周期以及开发成本,并且还得够达到Unreal虚幻引擎开发出的那种游戏体验效果.Unity开发也算是基于。NET平台上的一个拓展,它的内核是Mono框架,而Mono是基于.
16、NET的一个跨平台的继承开发环境,它能够很好的移植到各个平台,所以Mono的问世也给广大.NET平台开发者带来了福音,终于不会在收到微软的约束,开发出来的东西只能运行在windows平台。正因为这样,Unity也是一致收到广大。NET开发者的喜爱.发展至今Unity已经支持了基本国内外所有的主流平台。也正是因为这一特性,才使得更多的公司更多的开发者对它抛出了橄榄枝,达到了开发出来的游戏,不要受平台的限制,能够给玩家更多不同的平台体验,它的这一特性也推动了Unity引擎的飞速发展。结合自身的优势,由于我大学期间一直自学的。NET开发,所以还是有一定的。NET开发基础和经验,加上喜欢钻研,学习了其
17、他Android、IOS等移动平台开发,所以了解的技术范围还比较广泛,感觉做Unity开发能将我所了解的这些多平台开发的知识能够很好的融会起来,所以当第一时间了解到Unity之后,我就对它产生了浓厚的兴趣。之所以选择做斗地主游戏,因为首先我觉得它是一款比较经典的游戏,经典的往往能够是永恒的,在日常生活中,斗地主也常常是人们娱乐的一个项目之一,当然想完成它还是有一定的难度,设计都不少的算法,并且我将其网络化,开发起来对我而言还是有一定的挑战性,但又不是力所不能及,只要努力一下还是能实现的.因此就确定了这个多平台的多人网络斗地主的课题。1.2 设计的目的从玩家的角度,这种网络小游戏满足了玩家休闲的
18、需求,让玩家换一种方式重温经典,能够在不同的平台,不同的的地区,还能够在同一个“房间”进行对局,也可以实时交流,也能结识更多的朋友,增加了游戏体验的乐趣,从而丰富了人们的业余生活,在紧张的工作之余带给人们最大程度的放松.从自身的角度,将大学所学的理论知识应用于真实的项目开发,做到了理论与相结合,理论知识指导实际操作,实际操作反过来也巩固了理论知识,从而更好的提升了自己的能力和项目经验。1.3 设计的意义通过亲自实践,验证了Unity3D引擎的跨平台性,也系统的了解到一个游戏项目设计的整个流程,从最初的规划到最后的实现,为今后走上工作岗位打下基础。最后能够圆满实现,锻炼了自己的能力,同时做出来的
19、游戏也增加了人们业余生活的乐趣。第2章 开发环境及相关技术介绍2。1 开发环境介绍所谓工欲善其事,必先利其器.要做一个项目的开发,首先得选择好合适的开发工具,市场上行行色色的开发工具很多,这就需要要对比选择,根据项目需求选择最佳的搭配工具.本设计采用的开发环境是Windows7旗舰版操作系统,搭载Unity3D 4。2。0f1专业版引擎。采用Visual Stdio 2010IDE编辑C#脚本。2。1。1 Unity3D简介Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整
20、合的专业游戏引擎.Unity能够运行在Windows 和Mac OS X系统下,可发布游戏至Windows、Mac、Wii、iPhone、Windows phone 8和Android等平台.也可以利用Unity web player插件发布网页游戏.Unity具有强大的脚本系统,它的核心思想是面向对象,把游戏场景中有所的物体都抽象成可编程的对象,从而将游戏编程转化为游戏对象的控制和调度,而控制游戏对象和对象调度的就是我们所说的脚本系统,关系图如下(图2-1):图2-1 Unity脚本系统2。1。2 Visual Stdio2010和MonoDevelopVisual Stdio作为微软最引以
21、为傲的集成开发环境,敏捷的智能提示、排版以及稳定的性能,是任何语言的IDE都无法比拟的.因此C语言开发,当然首选Visual Stdio。但是Visual Stdio不支持Unity的Debug(调试),必须要到AssetStore(Unity的插件商量)去购买一个UnityVS插件才能够实现断点调试功能.而MonoDevelop是基于.NET的一个跨平台的集成开发环境,主要支持的语言也是C#。Mono作为。NET向跨平台和开源的先驱,它打破了微软一惯封闭的风格,因此Mono也得到了业界的广大好评和重视。MonoDevelop是Unity自带的集成开发环境,相比较VS的优势就是能够不依赖插件从
22、而实现断点调试,还有就是能够在其他平台上运行,但是它也有弊端,没有VS那么强大的提示功能,对中文支持也不够友好,可以说这两个IDE来编辑Unity脚本个有利弊,看如何取舍,一般都是选择前者.2。1。3 Xcode简介Xcode是苹果公司向开发人员提供的集成开发环境,用于开发Mac OS X,iOS的应用程序,Xcode具有较强的编译速度。Unity导出IOS程序的时候需要导出Xcode工程,然后由Xcode编译导出发布,当然还需要申请安装苹果开发官方的开发者证书.文章最后在介绍Unity工程导出成IOS版本安装到ios移动设备上会详细介绍流程以及注意事项。2.2 C语言和Javascript脚
23、本这两者都是Unity开发支持的语言,当然还包括boo脚本,但一般不怎么用boo脚本作为开发语言,前两者语言,C国内人用的比较多,Javascript国外开发者用的比较多,接下来我们就做一个对比,这两种语言开发Unity有什么异同.在这里,因为Unity是基于.NET平台,而C#是。NET平台主推的语言,因此我就选择了C,能够更好的兼容。NET的一些库文件.2。2.1 C语言C是微软公司再2000年6月发布的一种全新的且简单、安全、面向对象的程序设计语言,是专门为。NET应用开发而诞生的一种新的计算机语言。它吸收了C+、Visual Basic、java等语言面向对象的特性,又继承了C语言的语
24、法简约的风格,体现了当今最新的程序设计技术的功能和精华.不同的是,C面向对象模型已经面向了Internet进行了重新设计,它使用的是.NET框架的类库,为了安全起见不再主张指针类型的使用,当然也是可以使用指针,在程序中要做特殊申明。对指针使用的弱化,避免了程序异常访问系统内存地址而带来的隐患,从而更体现了它的健壮性的特点。C不支持多继承,避免了以往类层次结构中由于多重继承带来的难以控制的特点,C主张用接口来实现而不是多继承,主要的目的就是减少程序的复杂性,减少出错的可能性,使运行效率更高。NET框架为提供了一个强大的、易用的、逻辑结构一直的设计环境。同时,公共运行时(Common Langua
25、ge Runtime)为C语言提供了一个托管的运行环境,使程序比以往更加稳定、安全。C语言的特点有:.语言简洁优雅、安全稳定.保留了C+面向对象的特性。能够快速开发应用。强大的开发控件。支持跨平台2。2.2 Javascript语言Javascript是一种直译式、动态、弱类型、基于原型的脚本语言,内置支持类。它的直译器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。Javascript语言的特点:。简单性。动态性。跨平台性.安全性2。3 IOCP框架简介IOCP全称I/O Completion Port,
26、IOCP模型属于一种通讯模型,适用于(能控制并发执行的)高负载服务器的一种技术,基于IOCP通信的的服务器是以多线程的方式实现了与多个客户的消息并发交互,可以合理有效的处理客户端端的消息,可以使得系统内存资源得以合理的利用,有效的解决了因多线程竞争所带来的问题.2.3.1 IOCP内部工作队列图如下图22(源于IOCP本质论),简节明了的看出IOCP本质其实就是创建一个线程池然后内部是以队列和栈的方式来处理客户端交互请求.图2-2 IOCP内部工作队列图2.3。2 程序实现IOCP模型的基本步骤如下图(23),最重要的步骤还是创建了线程池来管理大量线程的切换处理从而提高了服务器端的性能。图23
27、 程序实现IOCP模型步骤2。3。3 使用IOCP模型和不使用IOCP模型通讯的对比对比图如下(图24),很明显能看出不一样的地方,不适用IOCP,用普通的socket连接,我做过测试,对服务器内存资源消耗比较大,貌似上百多个客户端连接之后服务器端就容易崩溃,内存发出警报,健壮性是服务器端程序首当要考虑的,而测试使用IOCP模型的客户端能够达到2K3K左右的稳定连接,并且内存资源消耗还比较小,下文测试章节会有具体的截图。图24 使用IOCP和不使用IOCP框架通讯对比2。4 本章小结本章主要介绍了开发Unity游戏所需要的脚本语言以及开发环境。之所以选择C而非js是因为C语言更面向对象和具备一
28、些高级的特性(封装,继承,多态,反射和泛型等),它也是国内的主流开发语言之一,而Javascript相对比较容易入门,语言本身是弱类型不需要那么严谨,在实际商业项目开发中不是太收推崇。因此本次设计以C#语言编写,同时采用MonoDevelop4。0调试和VisualStdio2010集成开发环境。服务器端基于IOCP模型搭建的比较稳定、高效、健壮的服务器应用程序。第3章 系统需求分析3.1 用户功能需求分析系统是由登录,叫地主,出牌,压牌,判断胜负,用户奖惩机制,实时聊天,退出等功能组成。该斗地主是根据民间盛行的扑克牌游戏演变而来,融入了现代电子游戏快捷便利,能更好的满足玩家的游戏体验以及提升
29、业余生活的乐趣,达到缓解压力的效果。3.2 系统性能要求系统必须稳定安全,对异常处理要做的比较完善,首先确保的是服务器端的稳定高效的运行,服务器采用的收费阿里云服务器,里面承载的是经典的windows server 2003服务器系统,然后服务器端采用的是IOCP框架用Winform应用形式呈现出来.3。3 可行性分析我将从以下几点分析该设计的可行性:(1)经济上的可行性考虑到是多人在线网络斗地主,而非仅局限于局域网的范围,因此就必须有一个稳定的外网服务器,目前我在公司管理着公司用的阿里云服务器,因此我决定临时可以租用一下公司的云服务器,经济上是可行的。(2)技术上的可行性本系统不需要差大规模
30、的计算和非常高的性能要求,可能需要处理一些中级一点的并发处理问题,对服务器端的性能还需要有一定考究,但不至于力所不能及,还有一些关于牌类的算法,例如洗牌算法,发牌算法,压牌算法等,但通过自己的思考相信也应该是可行的。(3)资源可行性虽然没有美工做配合,但网上搜集一些简单的免费的图片还是能够找到,可能效果不是非常的理想,但从程序实现的角度,基本能达到预期的要求,如果以后想要完善,可以找专门的美工做好图片然后进行替代即可。(4)游戏可玩性玩家可以通过设置用户名进行登录进游戏大厅进行多人对战,如果还想要做的完善一些可以专门接入腾讯或者新浪微博的sdk,用专用的账号登录或者是普通注册即可,用户也可对其
31、个人信息进行修改。第4章 总体方案设计4.1 纸牌设计4。1。1 牌型设计总所周知,一张纸牌是由数字、花色、背面所组成,在设计游戏之前先设计出一副牌的所有模板,这里列举一些部分牌的截图(图41):图41 牌型搜集出一整副牌的图片,然后程序里就可以通过代码来调用显示到界面。4。1。2 出牌类型(游戏规则)设计出牌类型有很多种,包括:单牌、一对、三张、三带一对、四张一样(炸弹)、王炸(大小王)、三连对、飞机等,详细游戏规则可以参考附录A.4。2 C/S模式C/S(Client/Server,客户机/服务器)结构,是大家熟知的客户机和服务器结构。它是软件系统体系结构的一种。主要是由客户端应用程序(C
32、lient)和服务器端程序(Server)以及中间件(middle)三个部件组成。客户端应用程序是是系统中用户跟服务器进行数据的交互的部件。服务器端程序负责有效个管理系统资源,处理多个客户端连接请求以及跟多个客户端进行数据交互。4。2.1 基于C/S模式的服务器端设计流程图服务器端处理客户端连接流程,参见下图(图4-2)图42 服务器端处理流程4。2。2 基于C/S模式的客户端设计流程图 客户端连接服务器流程,参见下图(图43)图4-3 客户端连接流程4。3 游戏逻辑程序结构本设计的程序结构包括三个层次(数据层,控制层,显示层),也就是常用的MVC模式。MVC的可移植性,代码逻辑比较清晰,耦合
33、度也比较低,在代码重构和结构方面比较有优势.4。3。1 数据层(1)通过socket获取byte流数据并解析成对应的Model实体。(2)创建存储Model实体数据的数据结构(全局单列类,静态类)。(3) 通过数据构造byte流并通过socket发送到远端.通过socket从远端获取其他玩家的状态(包括在线状态、出牌状态、手牌状态等)。4。3。2 控制层(1)通过事件机制获取到现在需要进行的操作。 (2)通过数据层提供的方法或者接口获取相关数据并进行相应处理。 (3)处理结果返回给事件发起者或存入游戏状态管理机。 主表表现在对牌的控制,例如叫地主,出牌,压牌,以及游戏的状态控制等逻辑操作。4。
34、3。3 显示层 (1)通过数据计算出游戏物体在游戏世界中的位置 (2)播放声音这类的元素 (3)获取游戏对象 主要就是控制游戏场景显示。4。4 游戏设计流程图游戏设计思路大概流程图,参见下图(图4-4)图44 客户端连接流程4。5 数学建模数学建模是一种数学的思考方法,是运用数学的语言和方法,通过抽象、简化简历能近似刻画并“解决”实际问题的一种强有力的数学手段.斗地主游戏是属于经典的棋牌类游戏中的一种,在进行这个游戏开发的之前,就需要对其进行一个建模,将抽象的游戏将其形象化数字化的表现出来.扑克牌类的游戏,每一张纸牌都有一些非常重要的属性值,那就是牌面上数值的大小以及它的花色类型。总所周知,一
35、副扑克牌有54张(包含大小王)。那我们可以将其抽象成053与之一一对应的54个数值,这样就将抽象的牌类比较形象的转化成数值的比较。我们规定一一对应的数值关系:l 方块A、方块2.。方块K0,1.。12l 黑桃A、黑桃2。.黑桃K-13,14.。25l 红桃A、红桃2。红桃K-26,27。.38l 梅花A、梅花2。.梅花K39,40。.51l 小王、大王-52,53单张牌大小关系: 大王小王2AKQ。.43假设我们要进行两张单拍的大小比较的时候,其实就是在比较两个整形数字的“大小,例如:黑桃3VS方块4,就是比较15和3的“大小”,但并非就是两个整形数字的直接大小比较,因为我们知道斗地主游戏中牌
36、的大小比较不需要考虑花色,只需要关心牌面上的数值大小即可。所以设计中对纸牌的一系列操作,形象简单点点说就是对一个整型数组的操作.上面的两个牌面大小比较方法是 1513=2,24,所以还是“415”,也就是方块4黑桃3,这里注意一点的是牌型为A、2、大小王他们对应的数字要做特殊处理.具体算法参见5。1.我就是用这种数学建模的方法来达到化抽象为形象,将实际问题转化成数学问题来处理.第5章 详细设计与系统实现5。1 斗地主洗牌算法做斗地主项目,洗牌算法是最基础也是最关键的一步,怎样“洗”的均匀,“洗”的随机,这是非常有考究的,算法的优劣直接会影响游戏效果的好坏,在平时生活真实的斗地主过程中,我们为了
37、要确保牌洗的随机,我们就多洗几次,那么在程序设计中,我们可以用一个算法来模拟真实洗牌的过程.我的做法是将053这54个数字直接先依次输入到数组中,然后不断的进行两个“牌”之间的位置对调,当然平时生活中洗牌跟折半插入算法非常接近,但我还是用相比较折半插入更随机的算法来实现洗牌效果.大体算法思路,详细代码请参照附录B的1算法(斗地主洗牌算法):for(int i=0;iMAX;i+) dataRandom(0,54)与dataRandom(0,54)两位置上的值进行互换效果图(图51):图5-1 洗牌算法效果图MAX如果选择的越大,则说明交换的次数越多,随机性就越明显,这里我是选择的是MAX=54
38、进行测试,看起来数值排列还是比较随机的,基本能达到预期效果。5。2 斗地主之“排序”算法制作斗地主的时候,发完牌还有基础的又比较重要的步骤就是牌的排序,这里的排序并非指一般的整形数字通常的排序,扑克牌中每种花色的牌有13张,那我们就以13为基准,将053的数字先对其取13的余数,得到的数加1即是当前纸牌的数值,参照上面的定义012分别对应方块AK,1325对应的是黑桃AK,2638对应的是红桃A-K,951对应的是梅花AK,然后由服务器端分配三份牌分别发给同一桌的三个玩家,但分完每一份17张牌必须进行一个排序,排序之后的手牌也方便玩家看牌,提高了游戏的可玩性.大体算法思路,详细代码请参照附录B
39、的2算法(斗地主排序算法):先封装一个数字对应牌值的算法,主要就是通过整除和求余来判断是什么花色然后是什么花色和什么牌值,对大小王和A、J、Q、K要做特殊判断处理.程序运行效果图:效果图(5-2):图52 ”排序”算法效果图5。3 基于IOCP的Socket通讯既然是网络游戏,那么就不得不谈一谈Socket通讯,C#版的Socket是Microsoft.Net Framework为应用程序访问Internet提供的网络通讯类库。通讯的原理是服务器端打开本地ip上的某个特定端口,然后不断的进行监听客户端的连接请求,然后做出响应的处理,简单的流程如下图(53),代码请参见附录B的3:图5-3 So
40、cket通讯流程图其中SocketAsyncEventArgs是。NET提供的关于异步socket类,封装了IOCP的使用,可以方便实现NIO(nonblocking IO),NIO对于某些场景下Server性能和吞吐量有很大好处。在应用中证明C#编写基于。NET IOCP的高性能服务器可以支持10000个以上的TCP长连接,SocketAsyncEventArgs是.NET Framework升级到2。0之后,。NET Socket提高的一种更高效的方法,对底层IOCP的实现在性能做了不少改进.我之前一开始做Socket服务器没有采取IOCP框架,就是单纯的通过多线程和Socket配搭建的服
41、务器,因为一般监听Socket在监听的时候会发生IO堵塞,这就必须要在单独开辟另外一个线程来监听,原先的我曾做过就是以简单的多线程来搭建的服务器,但后来意识到当客户端连接多了服务器端就很不稳定,资源消耗比较大,性能比较差,只能做Socket通讯学习之用,真真商业应用就差很远了。后来基于IOCP框架搭建的服务器,无论是从服务器性能,还是从系统稳定性考虑都非常好。连接效果图如下(图5-4):图54 Socket通讯效果图当客户端输入用户名之后,点击登陆服务器会发现服务器端接收到了用户连接,并且显示出接收到的字符串为:dengl1*,这里有我自己自定义的协议,两个号之间才是真真有效的数据,其他的都是
42、协助服务器端判断用户发送的信息是要进行一个什么样的操作.5。4 User对象的设计5。4。1 玩家状态设计这里玩家的状态通过枚举的方法来列出,主要包括:enum State none, /空着 read, /已经有个连接 isonline, /正在玩游戏中 iszhunbei /准备进入游戏分别对应的主要状态切换的方法有:public void Zhunbei()state = STATE.iszhunbei;/准备中,可以发牌public void OnLine()state = STATE.isonline; /在线的方法public void OffLine()state = STATE
43、。none;username=;connstringid=”;/离线5。4。2 玩家的属性以及手牌的操作方法l 属性1.手牌 public List cards2。用户名 public string username;3。玩家状态 public STATE state = STATE。none;4。所在桌子 public Table table = null;5。token public AsyncUserToken token;l 方法函数默认构造函数 public User(string connected,AsyncUserToken token)this。connstringid =
44、connected;state = STATE。none;this。token = token;删除手牌public void RemoveCards(Listint cards1)foreach(int temp in cards1)Cards.Remove(temp);添加手牌Public void AddCard(listint cards1)foreach(int temp in cards1)Cards.Add(temp);判断断开的是否是当前玩家public bool isequal(string id) return connstringid = id;对于服务器而言,每一个游戏
45、玩家就是一个User对象,因此定义一个User对象便于管理。5.5 Table对象的设计5。5.1 桌子状态设计桌子的状态也是同样用枚举表现出来,共有两种状态:public enum TableStatewait,/准备中 game /游戏中在构造函数中将TableState设置为wait.5。5。2 Table的属性及方法属性1。用于定期检测的定时器 public Timer timer;2.桌子的状态 public TableState state;3。桌子的ID public int id;4。三个玩家列表 public ListUser users;5。三张底牌 public int
46、dipai;6.判断房间是否有人断线 public bool isok = false;7。记录几个人叫了地主 public int count = 0;8。当前的分数 public int score = 0;9.记录当前房间应该谁发牌 int currentindex = -1;10.当前存在的人数 public int onlinetable = 0;11。当前收到的牌 public string carddata1=”;12.记录目前最的牌最大 public index = 1;13。计算该轮到谁发牌了 public int NextIndex;方法1.构造函数public Table()for(int i=0;i3;i+)users.Add(new User(“”,null));timer。Elapsed+=new Timers.ElapsedEventHandler(Check);/添加timer。Interval = Confige。sleeptime;/间隔时间TABLESTATE=TableState.wait;/桌面状态2。添加用户public AddUser(string connected,AsyncUserToken);3。判断当前桌子所有玩家是否都准备public bool isallzhunbei();4。