Java网络游戏框架框架实现

Java网络游戏框架框架实现

ID:45238820

大小:1.39 MB

页数:39页

时间:2019-11-11

上传者:U-145848
Java网络游戏框架框架实现_第1页
Java网络游戏框架框架实现_第2页
Java网络游戏框架框架实现_第3页
Java网络游戏框架框架实现_第4页
Java网络游戏框架框架实现_第5页
资源描述:

《Java网络游戏框架框架实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

《Java高级程序设计》专业教程理论讲解部分Ver3.120061 课程概述网络游戏服务器架构的目标及策略架构的设计剪子包袱捶服务器端的实现剪子包袱捶客户端的实现重点架构的设计难点架构的实现学习目标学习网络游戏架构掌握架构的设计及实现利用架构实现网络游戏20062 1设计目标及策略简易性:可扩展性:可测量性:高性能:核心类应该被设计的简易合理.一个服务器程序可以为多个种类游戏提供服务服务器同时需要处理非常多的网络连接,必须要可测量.服务器要实现最快的信息流通.一个较慢的事件处理不能影响其他的事件处理.20063 为了实现以上目的,我们首先要做到以下几点:◎将流通的消息压缩成GameEvents(游戏事件)◎将实现与逻辑分离开◎将服务过程分离成各种的线性任务◎将各种任务在线程池(threadpool)中备份以便实现并行操作◎从任务中分离出事件(event)序列◎提供一个可以在同一个服务器程序上实现多个游戏的逻辑框架1设计目标及策略20064 2设计服务器与客户端的通讯流程如下图:20065 在上图中可以看到,流程序列开始与客户端向服务器端的连接并且服务器处于监听状态.然后,客户端生成并发送一个事件(Event)到服务器.服务器接收到事件,分析并处理这个事件.这个事件通常会引起服务器发送一个或者多个事件到一个或者更多的客户端,客户端接收到这个事件并且处理.然后继续以上的循环.就像你看到的,大多数的交互都是由客户端引发的,但是服务器也会产生一些不依赖客户端的事件.比如由时间触发的一些事件.一些设计决策应该考虑到共享服务器的问题.首要的问题就是事件(Event)的设计,因为事件(Event)是服务器程序最重要的数据结构.其次就是要精细的研究哪些类与接口是必须要实现的在讨论处理事件序列之前.2设计20066 3GameEvents分析客户端与服务器通讯都是通过事件实现的.决定事件的格式对于每一个独立的游戏来说是非常重要的而且要保证服务器架构的透明性,所以我们提供一个事件接口来实现各个阶段的交互.这样,我们就可以为每一个游戏制定各自不同的事件格式了.现在有很多种不同的数据传输格式.这个选择高度的依赖与每个游戏在我们的游戏框架内主机的实现.多数普通级别简单的ASCII文本(ASCIItext)消息经常被用在聊天程序中.然而一个有实时级别命令的程序就需要更为复杂的结构.这里我们讨论一组可行的方案,你应该根据具体的游戏来设计一个更为适用的事件结构.20067 选择各种事件结构的标准如下:结构的大小因为你要在网络上发送事件结构,所以结构的大小非常重要.一个宽带网络可以保证发送很大量的消息.一个三维的游戏通常要比一个二维游戏发送的数据量大.可读性保持事件的可读性有利于错误的查找,但是这会与第一个判断条件--结构的大小相冲突.一个折衷的办法就是使用短语(缩略语)以维持可读性.运行效率一个事件必须要从一个对象格式转换为可以在网络上发送的格式在网络上流通,然后还要转换回来.在这个过程中,要保持很高的效率并且不能过于复杂.3GameEvents分析20068 分析代码的大小出于对具体设备的考虑,客户端的程序代码不能过大(比如在移动设备上的客户端).所以不能设计过大的代码库来实现事件格式.可扩展性该格式应该可以实现多种的事件种类下面我们来看看几个可行的方案,根据以上的标准分析一下.最后你要选择那种类型的方案对于数据的聚合函数的制定带宽的要求以及事件的分析处理都非常的重要.3GameEvents分析20069 可行的方案:java对象使用java内置的功能使java对象转换为比特流(bytestream).这样做的好处:非常容易实现,结构的大小处理的速度表现都非常出色,只会带来非常小的附加代码因为功能是java内置的.它的缺点是几乎没有可读性.XMLXML在各种各样的网络通讯及数据存储方面越加的流行起来.对于我们要讨论的事件格式来说,它有非常高的可读性以及对于多种多样的事件类型的可扩展性.然而,它的缺点远远掩盖了它的优点.当它连续的使用时,数据量实在太大了,并且要处理大量的头部信息.它要增加很多的附加代码在客户端上.3GameEvents分析200610 可行的方案:自定义二进制这种方式主要是将事件直接写到一个字节序列(sequenceofbytes)上,用尽可能少的字节来表达各种数据类型.这种方式通常被用在对传输数据大小极为严格的场合.这种方式提供了最高效的传输数据利用率,并且非常容易输出到网络,分析的效率也非常的高效.不过它也同java对象一样,完全的失去了可读性.但是它是在对带宽要求非常苛刻的条件下唯一的选择.3GameEvents分析200611 可行的方案:二进制编码的XML在带宽及存储资源允许的情况下,程序员们意识到利用冗长的XML是一件非常不错的事.但是在无线连接的情况下,问题变得比较尖锐.WAPBinaryXML格式是W3C推荐针对这类问题的解决方式.这是一个折衷的好办法,在传输的时候不具可读性,在反编译后又变为普通的XML.这种格式提供了高效的传输数据的利用率,但是无论编码还是解码都要加上头部信息.3GameEvents分析200612 4设计中的术语GameName.一个游戏的名字.例如象棋纸牌等.Game.对于一个GameName的实现.GameID.一个Game无重复的编码.Player.一个连接到服务器的用户,他可以参加游戏当然也可以不参加游戏.PlayerID.一个Player无重复的编码.Session.一个用户从登陆到退出的过程.这个过程可以有一次或者多次的连接与断线.SessionID.一个Session无重复的编码.EventType.一组事件类型(eventtypes)的一个,它决定了这个事件的目的.如:LOGINCHAT_MSG或者MOVE.200613 5类的设计服务器端类的关系图如下:200614 客户端类的关系图如下:5类的设计200615 5.1共有类与接口在框架中,存在一些服务器端与客户端共有的类和接口,它们都被定义在com.hypefiend.javagamebook.common包中.AttachmentEventHandlerEventQueueGameConfigGameEventGameEventDefaultGlobalsNIOUtilsPlayerPlayerDefault5类的设计200616 其中有些类和接口需要详细的了解它们的细节,下面我们来介绍一下.GameEvent接口在我们的架构中,我们定义了一个事件接口并且给出一个默认的实现.如果有需要的话,每个游戏应该继承或者干脆替换掉这个默认的实现.GameEvent接口的定义参见源代码.除了GameEvent以外,还需要有一个处理事件的接口EventListener.它只定义了一个方法publicvoidhandleEvent(GameEventevent);5.1共有类与接口5类的设计200617 GameEventDefault它是GameEvent的默认实现.它是直接按顺序将数据读写到ByteBuffer中的.下面看看它的write()publicintwrite(ByteBufferbuff){intpos=buff.position();buff.putInt(eventType);NIOUtils.putStr(buff,playerId);NIOUtils.putStr(buff,sessionId);buff.putInt(gameId);NIOUtils.putStr(buff,gameName);buff.putInt(numRecipients);for(inti=0;i0){try{inEvent=inQueue.deQueue();switch(inEvent.getType()){caseGameEventDefault.S_LOGIN_ACK_OK:break;caseGameEventDefault.SB_LOGIN:stdOut("login:"+inEvent.getMessage());break;6.2类的设计6网络服务器的实现200631 caseGameEventDefault.SB_LOGOUT:stdOut("logout:"+inEvent.getMessage());break;caseGameEventDefault.SB_CHAT_MSG:stdOut(inEvent.getPlayerId()+":"+inEvent.getMessage());break;caseGameEventDefault.S_DISCONNECT:stdErr("disconnectedfromserver:"+inEvent.getMessage());shutdown();break;caseGameEventDefault.S_JOIN_GAME_ACK_OK:stdOut(inEvent.getMessage());inGame=true;break;6.2类的设计6网络服务器的实现200632 caseGameEventDefault.S_JOIN_GAME_ACK_FAIL:stdOut(inEvent.getMessage());inGame=false;break;caseGameEventDefault.SB_PLAYER_QUIT:stdOut(inEvent.getMessage());inGame=false;break;default:stdOut(inEvent.getMessage());break;}}catch(InterruptedExceptionie){}}}6.2类的设计6网络服务器的实现200633 publicStringgetGameName(){return"RPS";}publicGameEventcreateGameEvent(){returnnewGameEventDefault();}publicGameEventcreateLoginEvent(){returnnewGameEventDefault(GameEventDefault.C_LOGIN);}publicGameEventcreateDisconnectEvent(Stringreason){returnnewGameEventDefault(GameEventDefault.S_DISCONNECT,reason);}}6.2类的设计6网络服务器的实现200634 RPSConsoleEventReaderRPSConsolEventReader是客户端通过标准输入设备读入用户消息的类.我们用BufferedReader来进行行读取.然后生成相应的事件发送到EventQueue中.注意:在运行的时候注意,需要在运行命令后面添加两个参数,第一个描述服务器的地址,第二个是登陆用户的名称.6.2类的设计6网络服务器的实现200635 本课小结本课介绍了网络游戏框架的设计及实现,并且以石头剪刀布为例在该框架下实现一个简单的游戏。作为一个完整的Java项目,几乎包括了前面所有的知识。200636 小测验1.简述框架中服务器端类的构成、作用及相互关系。200637 小测验答案1.简述框架中服务器端类的构成、作用及相互关系。答:略200638 课后作业【作业1】试编写代码,利用该框架实现一个简单的游戏。200639

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭