- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《java游戏服务端实现
java游戏服务端实现
?
一个多人在线的棋牌类网络游戏的项目临近尾声,我参与了该项目的整个设计流程,并且完成了90%的核心代码。关于这个项目,有很多地方值得聊一聊。本系列不打算把这个项目将得多么详细规范,那是设计文档应该描述的,我打算只说说一些值得注意的地方。 这个项目的一个特别之处是,客户端是手机,用户通过移动网络与服务器通信。和PC相比,手机的处理能力极弱,而且网络流量费用昂贵。因为除了要考虑普通网络游戏的一些问题之外,这两点也需要在设计中充分考虑。 首先是开发语言的选择,由于服务器是Linux的环境,MS的技术直接排除,至于MONO嘛,我实在不放心。可供选择的是C++和Java,Java胜 在网络能力强大,开发周期短,有众多框架和开源库的支持,要写出烂得不可接受的代码也不容易;C++则胜在速度快。综合各方面因素,C++更容易把这个项 目变成一堆代码噩梦,我们选择了Java。一、网络 网络游戏,首先面临的问题当然是如何进行网络通信。首先考虑的是HTTP协议,因为所有的J2ME手机都支持这个,我们当然想尽可能的兼容用户。而且HTTP协议封装程度已经非常高了,不用去考虑线程、同步、状态管理、连接池,不过HTTP协议有两个不爽的地方: ?协议无状态,这个问题已经困扰过很多人很多次了。我曾考虑过的解决办法是改造HTTP协议,在数据传输完成之后不关闭socket,但是这样做工作 量非常大,在项目周期中,基本上就是Mission?impossible,不予考虑。那么客户也就只能通过轮询的方式向服务器请求数据。 ?网络流量过大。就这个项目来说,网络间传递的只是指令,但是每次传递都要加上一堆毫无用处的HTTP?Head,再加上客户端需要做轮询,这个流量 对于手机来说简直恐怖,经简单测试,按照0.03元/K的GPRS网络费用计算,一局牌居然要消耗1元多的费用(每秒轮询),实在不可接受。也许我们可以 采用流量费包月的资费方式,不过这个话题与技术无关。 以上问题导致我们选择了Socket,这意味着我们将没有一个web环境,很多东西都要靠自己去实现:线程管理、客户状态监控、对象池、控制台………. 网络部分打算采用Java?NIO来实现,这是一种新的网络监听方式,基于事件的异步通信,可以提高性能。每个客户端连接之后,会有一个独立的 SocketChannel与它通信,这个SocketChannel会在用户的整个生存周期中存在。用户如果断开连接,服务器会得到-1,并且会抛出 Connection?reset异常,通过捕获这两个特征,可以在用户意外断开连接后清理相关的资源。由于NIO是异步通信的,所以没有复杂的线程管 理。二、通信协议 这个项目并没有复杂的通信指令,命令数量很有限,但是还是有个关键问题需要关注:流量。为 了尽量减小流量,我们使用字节代替字符串来保存系统指令,这样可以使流量减少一半,比如使用一个字节来保存一张扑克牌,字节高位表示花色,字节低位表示数 字,如果0代表黑桃,那么黑桃三就应该是0x03,这个需要靠位操作来实现:
int??m=0;
????int??n=3;
????byte??card=(byte?)(m)4)|((byte?)n;?//m左移四位,然后与n左或操作
游戏中需要传递用户的积分,这是一个大整数,使用四个字节来保存比较保险,将整数转换为四个字节的操作如下:
public??static??byte?[]?translateLong(long??mark)
{
????byte?[]?b?=?new??byte?[4];
????for??(int??i?=?0;?i??4;?i++)
????{
????????b[i]?=?(byte?)?(mark??(24?-?i?*?8));
????}
????return??b;
}
将四个字节转回来的操作如下:
public??static??long??translateByte(byte?[]?b)
{
????int??mask?=?0xff;
????int??temp?=?0;
????int??res?=?0;
????for??(int??i?=?0;?i??4;?i++)
????{
????????res?=?8;
????????temp?=?b[i]??mask;
????????res?|=?temp;
????}
????return??res;
}
三、数据库连接池 由于没有一个web环境,所以我们需要自己实现一个数据库连接池,apache有一个项目叫做commons?DBCP,这是一个基于apache自己 的对象池(apache?commons
您可能关注的文档
最近下载
- 4AM3U3 In the shop At Panda’s Glasses Shop ppt英语教学课件.pptx
- 2023年四川省成都市高考物理一诊试卷(含答案解析).docx
- 人教版(2024)英语七年级上册Unit 5 Fun Clubs重难点题型专练(含答案).doc VIP
- GB50174-2008电子信息系统机房设计规范.docx
- 2006-年度经教育部备案或审批同意设置的-高等学校本科专业名单.pdf
- 河南省青桐鸣大联考2024-2025学年高二上学期10月月考英语试题(含解析,含听力原文无音频).pdf VIP
- _电缆桥架安装图集.pdf VIP
- 2024入团前基础知识题库(含答案).docx
- 《小萝卜头的故事》PPT课件.pptx
- 大厦高大模板专项施工方案.doc
文档评论(0)