教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教育文库 >

疯狂java实例-第15章 仿QQ游戏大厅(2)

来源:网络收集 时间:2026-08-31
导读: ServerThread中的run方法。 代码清单:code\GameHall-Server\src\org\crazyit\gamehall\server\ServerThread.java this.br = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); while((th

ServerThread中的run方法。

代码清单:code\GameHall-Server\src\org\crazyit\gamehall\server\ServerThread.java

this.br = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); while((this.line = br.readLine()) != null) { //得到请求对象 Request request = getRequest(this.line); //从request中得到客户端处理类, 并且构造Response对象 }

Response response = new Response(request.getClientActionClass()); //将请求的参数都设置到Response中

copyParameters(request, response); //得到Server处理类

ServerAction action = getAction(request.getServerActionClass()); action.execute(request, response, this.socket);

以上代码中的getRequest方法,只要通过XStreamUtil中的toObject方法即可以将客户请求的字

疯狂java实例-第15章 仿QQ游戏大厅

符串转换成一个Request对象,XStreamUtil已经在15.2.1中实现。当服务器线程得到Request对象后,就可以新建一个Response对象作为服务器的响应,并根据Request对象中的serverActionClass属性得到具体的某个服务器处理Action类,执行execute方法。需要特别注意的是,通过Request的serverActionClass属性得到某个实现类的时候,可以将得到的实现类实例放到一个Map中进行保存,那么当用户多次请求同一个Action的时候,就可以不再需要重复创建。

到这里,我们框架的服务器端已经全部实现了,在本章的代码中,对应的是GameHall-Server模块,按照以上的代码实现了该模块后,这个服务器模块就可以不再需要作改动,即使加入新的游戏,它也可以不用进行代码改变。GameHall模块只是服务器端负责处理转发的一个中间角色,它不负责处理任何的业务逻辑。由于在ServerThread中,我们需要使用反射来得到某个服务器处理类,因此,当加入一些新的游戏时,我们就需要将这些游戏的模块加入到环境变量中。一些公用的接口或者类,我们可以使用一个GameHall-Commons的模块来存放,例如可以将Request、Response、ServerClass、ClientClass、User和Game等接口与类放到GameHall-Commons模块中,客户端与服务器端的模块都依赖于GameHall-Commons模块。

15.2.4 编写框架客户端

由于我们这个游戏大厅的框架,并不需要编写任何的业务逻辑,因此客户端的实现与服务器端的实现基本类似。当用户编写了一个新的游戏时,就可以直接将游戏的包放置到客户端的目录中,用于给客户端加载相应的类。与服务器端的实现一样,都是负责一个中转的功能,当接收到服务器响应时(得到Response对象的XML),就直接根据Response对象中的actionClass来得到客户端处理类,同样再使用反射来得到某个客户端处理类的实例,再调用execute方法。这样做,就规定了发送请求时,需要声明客户端处理类,也就是设置Request对象中的clientActionClass,而在服务器处理时,就会将这个属性设置为Response的actionClass。每个客户端处理类都必须实现ClientAction接口。

编写客户端线程类ClientThread,该类的主体代码如下。

代码清单:code\GameHall-Client\src\org\crazyit\gamehall\client\ClientThread.java

InputStream is = er.getSocket().getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is)); while ((this.line = br.readLine()) != null) { Response response = getResponse(this.line); //得到客户端的处理类 }

ClientAction action = getClientAction(response.getActionClass()); //执行客户端处理类 action.execute(response);

根据服务器返回的响应字符串,将这些字符串转换成一个Response对象,再通过该对象得到具体某个ClientAction的实现类,再调用execute方法。与服务器端的实现一样,客户端也并不需要处理任何的业务,这些业务都交由客户端或者服务器端处理类进行。在本章中客户端模块为GameHall-Client。

15.2.5 建立登录界面

框架的客户端除了提供一个客户端线程类之外,还需要提供一个登录界面,让用户选择进入的游戏大厅(某个游戏的大厅)和输与相关的登录信息。由于登录界面并不与某个特定的游戏相关,只是用户输入信息的一个界面,因此可以将登录界面的相关类放到客户端的模块GameHall-Client中。登录界面如图15.1所示。

疯狂java实例-第15章 仿QQ游戏大厅

图15.1 登录界面

在本章中,登录界面是GameHall-Client的LoginFrame类。登录界面需要注意的是头像的下拉框实现,需要到特定的某个目录中读取所有的头像文件,该目录存在于GameHall-Client模块。在读取头像文件的时候,我们需要将读取到的头像文件封装成一个Map对象,该对象里面key为头像图片的相对路径,value就是该图片的ImageIcon对象。为了让下拉框中能显示图片,需要为下拉框JComboBox提供一个ListCellRenderer的实现类。

代码清单:code\GameHall-Client\src\org\crazyit\gamehall\client\HeadComboBoxRenderer.java

public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { String selectValue = (String)value; //设置背景颜色

if (isSelected) {

setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else {

setBackground(list.getBackground()); setForeground(list.getForeground()); }

//从头像的Map中得到当前选择的头像图片 Icon icon = this.heads.get(selectValue); setIcon(icon);

if (icon != null) setFont(list.getFont()); return this; }

注意以上代码中,需要得到下拉框所选中的值,这个值必须是Map中的某个key,这样的话,意味着需要将头像文件的相对路径作为值来创建一个JComboBox。以下方法创建一个JComboBox对象。

代码清单:code\GameHall-Client\src\org\crazyit\gamehall\client\LoginFrame.java

//创建头像选择下拉

private void buildHeadSelect() { this.headSelect = new JComboBox(this.heads.keySet().toArray()); this.headSelect.setMaximumRowCount(5); this.headSelect.setRenderer(new HeadComboBoxRenderer(this.heads));

疯狂java实例-第15章 仿QQ游戏大厅

}

以上的黑体代码,使用头像Map的key来创建JComboBox的选择项。除了头像的选择外,还需要特别注意的是游戏的选择下拉。在本章中,我们已经确定了游戏大厅只是一个简单的框架,在登录界面需要到某个目录去读取一些相关的包,将这些包所代表的游戏显示到游戏下拉中。因此还需要编写读取包信息的代码。

以下代码读取jar包。

代码清单:code\GameHall-Client\src\org\crazyit\gamehall\client\LoginFrame.java

File folder = new File("game"); for (File file : folder.listFiles()) { if (isJar(file.getName())) { //得到jar文件 }

}

JarFile jar = new JarFile(file); //得到元数据文件 …… 此处隐藏:3884字,全部文档内容请下载后查看。喜欢就下载吧 ……

疯狂java实例-第15章 仿QQ游戏大厅(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/279657.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)