目标手机软件
手机网游制造之
请求处理篇
开发程序:疯狂的
开发进度:第四期
本期要点:设计服务器端请求处理功能
开发平台:Java平台
经过前面3期的讲解,我们的手机网游《疯狂的》大体已经完成,在加上上本期开发的请求处理功能,就OK啦。快来试试我们的《疯狂的》吧(游戏下载地址:http://www.shudoo.com/bzsoft)。
既然是手机网游,自然客户端的数量就会比较多,所以多个客户端同时向服务器端发送请求的情况很常见。为了更好的运行,服务器端需要同时处理多个客户端的请求,这就是用到并发处理。下面就随着我们一起学习手机网游是如何并发处理多个客户端的请求的。
请求处理设计思路
在《疯狂的》程序的服务器端请求处理功能中,没有采用“线程池”技术,而是直接采用当一个客户端连接请求到达时,启动一个新的线程进行处理,在连接完成以后关闭线连接程。
通过为每个连接的客户端设置新的线程,很容易就实现了处理多个客户端的要求,使得多个客户端可以同时工作(图1)。在每个线程的内部,先根据客户端网络协议格式规定,解析客户端发送过来的请求数据,然后依据不同的请求命令分别进行处理。
如何并发处理
由于服务器端需要同时处理多个客户端发送的请求,所以需要对核心的数据进行并发处理,这样才能解决数据同步的问题。下面以分配用户ID为例子,来介绍服务器端并发处理的过程。客户端第一次连接服务器端时,服务器端反馈一个唯一的序号给客户端。服务器端每派发一个ID,ID的值就加1。
如果多个客户端同时发送请求,服务器端计数就有可能出错。使用Java语言中的synchronized关键字修饰处理逻辑,可以解决这个问题。使用该函数反馈的userID(图2),可以保证在多个客户端同时访问的情况下数据的同步。
设计服务端网络协议
服务器端网络协议,最主要的功能就是将服务器端的处理结果数据反馈给客户端,从而控制客户端的逻辑行为。在设计服务器端网络协议时,需要考虑有几种反馈指令以及每种反馈需要反馈的参数等。此外,还要考虑如何减少数据的重复。
服务器端的网络协议中的成功指令用于响应客户端的准备指令,在客户端登录成功以后,向服务器端发送开始指令,如果服务器端无法匹配对战用户,则反馈继续等待指令,这样客户端将继续等待其他玩家。如果有其他玩家匹配或已经由服务器匹配给其他玩家对战,则反馈初始数据指令,并反馈服务器端生成的房间编号、初始地图数据、角色数据等。
在游戏开始以后,客户端每隔一定时间发出获得数据指令,服务器端反馈游戏刷新指令,将当前游戏数据反馈给客户端。客户端发送的移动指令等,直接在服务器端进行处理,不反馈指令。
请求处理设计步骤
第一步:创建项目
启动Eclipse,选择“File→New→Java Project”,设置项目名称为“BomberServer”,并一路选择“Next”, 完成项目的建立。然后新建一个入口类,选择“File→New→Class”,设置名称为“Server”,点击“Finish”。创建项目的代码下载地址是http://www.shudoo.com/bzsoft。
第二步:设计游戏线程类
选择“File→New→Class”,并设置名称为“LogicThread”,点击“Finish”完成游戏线程类的创建,该类读取客户端发送数据以及向客户端发送数据。关键码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
//读取数据
byte[] b = new byte[1024];
is = s.getInputStream();
int n = is.read(b);
byte[] request = getData(b,n);
//数据错误处理
if(request.length == 0){
return; //结束程序
}
//处理逻辑
byte[] response = doLogic(request);
//如果反馈为null,则结束处理
if(response == null){
return;
}
//反馈给客户端
os = s.getOutputStream();
//HTTP协议信息
os.write("HTTP/1.1 200 OK\n\r".getBytes());
os.write("accept:*.*\n\r\n".getBytes());
os.write(response);
第三步:设计网络协议指令接口
选择“File→New→Interface”,设置名称为“ResponseCommand”,点击“Finish”完成游戏网络协议接口的创建,该接口包含所有网络协议指令的代码。关键码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
/**准备成功*/
public final static byte READY_OK = 0x0;
/**继续等待*/
public final static byte CONTINUE_WAIT = 0x1;
/**初始数据*/
public final static byte INIT_DATA = 0x2;
/**游戏刷新数据*/
public final static byte GAME_DATA = 0x3;
第四步:运行程序
在Eclipse主界面左侧的“Package Explorer”中,选中项目源代码Server.java,单击鼠标右键,选择“Run As→Java Application”即可运行程序。
总结
经过四期的设计,手机网游《疯狂的》就开发完成了,我们设计网络协议以及网络程序框架的思路,都是设计其他手机网络程序可以借鉴的。由于我们开发《疯狂的》的目的不是为了盈利,所以在一些细节上还比较欠缺。
开发实际的手机网游程序,还要考虑网络连接的时间、各个手机机型的网络设置、CMWAP和CMNET联网代码的区别、移动计费页面的处理、优化网络数据的传输和服务器端的数据存储。
对初次进行手机网游开发的程序员,建议先开发比较简单的网络程序,例如对战类的棋牌游戏或回合制游戏等,然后再开发复杂的游戏类型。设计网络协议时,要尽量减少网络实际数据的传输,这样既可以提高程序的执行效率,也可以降低网络流量。
到此为止,手机编程就将转入问答为主的互动了,大家可以在数动连线网站的编程板块中交流手机编程的问题,也可以在手机开发群中讨论。下期开始,我们将重点关注开心农场之类的编程,敬请关注。
读者反馈
开发QQ群:看了上期的文章,我有一个疑问,如何减少客户端跟服务器端之间的流量呢?
小编:编写手机网络程序,减少客户端和服务器端的流量是一个必须考虑的问题。减少客户端和服务器端之间的流量,可以从两个方面进行考虑。
1.减少客户端和服务器端之间的通讯频率,也就是减少单位时间内通讯的次数,扩大通讯之间的实际间隔。2.优化网络协议设计,优化协议设计减少每次传输的数据数量。同时使用这两个方式,可以显著降低客户端和服务器端之间的流量。
开发QQ群:我比较好奇,手机网游的服务器端放在哪里?也是在租用的服务器里面吗?
小编:手机网游的服务器端和普通的网游服务器端一样,都需要一个专门的服务器进行运行,只要该服务器满足在互联网拥有一个固定的域名或IP地址即可。服务器可以租用,也可以由公司自己搭建,不过一般都是自己搭建的。
读者问题:我的公司要开发药品管理系统,要支持PDA,能给我一些建议吗?
辛涛:要支持PDA有两种形式,一种方式是跟PC端一样用B/S架构,在PDA上使用浏览器访问管理系统即可。另一种方式是开发PDA上的客户端,通过网络直接操作服务器端的数据库。前一种方式实现简单,但不支持离线操作;后一种方式需另外开发客户端,但速度快、支持离线操作。你根据公司的实际情况来酌情选择吧。
第八个QQ群: 57137039,验证码:陈邓新。欢迎对手机编程感兴趣的朋友加入。
(河南 陈跃峰)