目标手机软件
手机网游制造之网络通信篇
开发程序:疯狂的炸弹
开发进度:第二期
本期要点:设计客户端网络功能
开发平台:Java平台
上期我们讲了客户端游戏功能,设计的程序只是一个单机游戏,为什么会这样呢?因为没有网络功能,无法进行通信。本期,我们就介绍客户端网络功能的设计。
客户端网络功能设计思路
客户端网络功能就是将客户端的操作转换为数据发送给服务器端,并将服务器端反馈的数据以界面的形式呈现给用户。如果把所有的逻辑处理都放在服务器端,当然是最安全的形式,但是这样服务器端的压力会比较大,所以一般会将一些简单的程序逻辑,例如本示例中移动时的边界检测,放在客户端进行判断。
设计客户端网络功能,要用到的指令有:准备(READY)、开始(START)、移动(MOVE)、取得游戏数据(GETDATA)和释放炸弹(LAYBOMB)等几种。在第一次连接时发送准备指令,从服务器端获得一个唯一的用户编号(userID),然后再发送开始指令给服务器,查看是否有其他用户准备对战。
如果没有则循环发送开始指令,如果有用户,则在服务器端分配房间号,然后服务器端新开设一个房间,并将游戏初始化数据反馈给客户端,客户端进入游戏界面。在游戏界面中,每隔1秒中向服务器端请求一次游戏数据,该请求中包含房间编号和用户编号,当用户移动时发送移动指令给服务器,当释放炸弹时发送释放炸弹指令给服务器(图1)。
网络协议设计
网络协议(Protocol)是网络程序的核心,也是一个网络程序最核心的机密。网络协议就是指网络传输时的数据格式,由两套格式组成:客户端发送的数据格式和服务器端发送的数据格式。其中客户端发送的数据格式和服务器端接收的数据格式相同,客户端接收的数据格式和服务器端发送的数据格式相同。
在本程序中,客户端需要发送的指令数量比较少,格式也不复杂,所以采用常见的“指令名称+参数”的格式设计,即传输的数据中开始部分通过一个数据来代表指令的类型,而将该指令需要的参数以一定的格式跟随在该指令的后面,形成一条完整的协议数据。跟详细的介绍,请到http://www.shudoo.com/bzsoft下载。
监听器模式分析
为了将客户端界面和客户端网络编程有效的结合起来,并复用网络编程部分的代码,一种比较好的方法就是使用“监听器模式”。监听器模式是指在一个类执行功能到达某个步骤时,将处理该步骤的功能代码委托给另外一个对象进行处理。
例如汽车上的警报器就采用了监听器模式,汽车被移动时警报器对象就通过发出声音进行处理。在网络功能中,也采用监听器模式,网络通讯线程将服务器端数据的反馈委托给界面类中的方法进行处理,从而便于界面的控制,避免数据的大量传输。
在本示例中,声明了一个HttpListener接口,实现该接口的类都具备处理网络通讯反馈数据的能力,当网络通讯中数据反馈以后,调用该接口中的doResponse方法进行处理。而每个需要进行网络通讯的类都实现HttpListener接口,则每个界面类都具备了处理服务器端反馈数据的能力,然后在实现了的doResponse方法内部进行反馈数据的处理。
客户端网络功能设计步骤
第一步:创建项目
启动Eclipse环境,选择“File→New→J2ME MIDlet Suit”,设置项目名称为“Bomber”,并一路选择“Next”, 完成项目的建立。然后新建一个J2ME入口类,选择“File→New→J2ME MIDlet”,设置名称为“BomberMIDlet”,点击“Finish”。最后,按照上期介绍的步骤编写界面的代码和按键处理的代码(代码下载地址:http://www.shudoo.com/bzsoft)
第二步:编写网络协议
选择“File→New→Interface”,设置名称为“RequestCommand”,点击“Finish”完成客户端发送指令接口的创建。输入网络协议代码,其中关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
public interface RequestCommand {
/**准备命令*/
public final static byte READY = 0x0;
/**开始命令*/
public final static byte START = 0x1;
/**移动命令*/
public final static byte MOVE = 0x2;
/**放炸弹命令*/
public final static byte LAYBOMB = 0x3;
/**退出命令*/
public final static byte QUIT = 0x4;
/**获取游戏数据*/
public final static byte GETDATA = 0x5;
第三步:编写网络线程类
选择“File→New→Class”,设置名称为“HttpThread”,点击“Finish”完成网络线程类的创建。输入网络线程的代码,其中关键码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
//建立连接
hc = (HttpConnection)Connector.open(SERVER);
//获得输出流
os = hc.openOutputStream();
//发送数据
os.write(data);
//读取响应
if(hc.getResponseCode() == HttpConnection.HTTP_OK){
byte[] tmp = new byte[1024];
is = hc.openInputStream();
int n = is.read(tmp);
//生成有效数据
byte[] b = new byte[n];
System.arraycopy(tmp, 0, b, 0, n);
//处理反馈
listener.doResponse(b);
}else{
listener.doError("服务器反馈错误!");
第四步:在按键处理中添加发送指令
在已有的按键处理代码基础上,编写发送指令的代码。其中关键码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
playerDire = DIRE_UP; //改变方向
if(playerY - BOX_TILE_HEIGHT > 22){//边界检测
new HttpThread(generateMoveData(DIRE_UP),this); //发送指令
}
break;
case DOWN:
playerDire = DIRE_DOWN; //改变方向
if(playerY + SPRITE_HEIGHT + BOX_TILE_HEIGHT < 210){//边界检测
new HttpThread(generateMoveData(DIRE_DOWN),this); //发送指令
}
break;
case LEFT:
playerDire = DIRE_LEFT; //改变方向
if(playerX - TILE_WIDTH > 0){//边界检测
new HttpThread(generateMoveData(DIRE_LEFT),this); //发送指令
}
break;
case RIGHT:
playerDire = DIRE_RIGHT; //改变方向
if(playerX + TILE_WIDTH + SPRITE_WIDTH < width){//边界检测
new HttpThread(generateMoveData(DIRE_RIGHT),this); //发送指令
第五步:运行程序
在Eclipse主界面左侧的“Package Explorer”中,选中项目源代码BomberMIDlet.java,单击鼠标右键,选择“Run As→Emulated J2ME Midlet”即可运行程序。
读者反馈
开发QQ群:看了上期的文章,《疯狂的炸弹》游戏界面可以改变成3D吗?
小编:可以修改成3D效果的界面,从而获得更加良好的界面体验。修改时主要影响程序中的界面绘制部分,对于用户操作控制以及网络部分都几乎不影响,程序的修改不会很麻烦。
开发QQ群:S60模拟器启动时闪一下就关闭了,为什么会这样?我在网上找了很久,都没有找到,所以才加入你们的群,请帮帮我!
小编:出现这种情况的原因有很多,下面列举几种比较常见的原因:1.编写的程序在运行是遇到错误或异常,阅读代码找出错误原因再进行修改 。2.模拟器的安装出现错误,重新安装模拟器。3.程序配置错误,重新配置开发环境。
开发QQ群:我的程序出现提示:Undefined symbol: 'int RSendAs::Connect(void) (?Connect@RSendAs@@QAEHXZ)',头文件加了的,为什么还会这样?
小编:为什么会这样,凭我的经验来看,应该是没有添加类库的引用,你添加过来再看看,应该就不会出现这样的提升了。
开发QQ群:我正在做一个软件,其中有一项是日期选择,我想调用一个现成的控件来实现,应该怎么做?希望高手给一点建议。
小编:这个需要看你开发时使用的语言和技术。如果你在开发时使用的是Java ME技术,而且使用高级用户界面进行开发,则可以使用DateField控件,如果使用低级用户界面进行开发,那么就需要自己实现界面的绘制和逻辑处理。
读者问题:手机开发中有支持移动定位技术的吗?
高手 悠然鸟:有的,例如在Java ME技术中,有一个可选包JSR179 Location API专门支持移动定位技术开发,如果手机支持该可选包,则开发者再进行开发时则可以直接使用该API提供的功能。
读者问题:在手机来电时立即暂停程序,这个功能是怎么实现的?
你是手机编程的高手吗?你能解答上面这位读者的疑问吗?不要犹豫,来我们这里展示一下你的风采吧,来信请发到[email protected](也可以给我们发送问题)。
第七个QQ群: 72407081,验证码:手机开发。欢迎对手机编程感兴趣的朋友加入。
(河南 陈跃峰)