分享
 
 
 

用Java自制手机联网游戏

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

移动通信的迅速发展,使手机用户越来越多。手机制造商诺基亚曾宣称,计划在2003年底之前销售1亿台使用java软件的移动电话。与此同时,Internet的进一步发展也急切需要用手机实现一些PC能够完成的功能。本文介绍了一个可以在手机上运行的联网游戏程序。通过这个程序,无论在何地,只要手机能够上网就可以和Internet上的朋友联网游戏(图11)。下面对程序的一些细节做一简要介绍,希望能给从事Java开发的技术人员一些启示。

J2ME简介

J2ME(Java 2 Micro Edition)是Java 2的一个组成部分,它与J2SE、J2EE并称。根据Sun的定义:J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂窝电话和可视电话、数字机顶盒、汽车导航系统等等。J2ME技术在1999年的JavaOne Developer Conference大会上正式推出,它将Java语言的与平台无关的特性移植到小型电子设备上,答应移动无线设备之间共享应用程序。

J2ME的构架

J2ME的构架如图1、图2所示。

图1 J2ME的构架1

图2 J2ME的构架2

程序运行的环境

客户端即为手机(需支持J2ME的手机,例如motorola 388)用户,编程环境是windows 2000 server + MotoJ2SDK+JDK1.3.1+MS SQL server2000,服务器端为Windows 2000 server+JDK1.3.1。

J2ME编程流程

以MotoJ2SDK的开发过程为例,其流程如下所示:

图3 J2ME编程流程

程序简介

服务器端代码的编写

客户端和服务器端采用Socket连接。服务器端需要时刻监听客户的请求(如图4),一旦有客户需求,它就需要马上响应(如图5),并做出相应的处理,然后将结果返回给客户,客户显示服务器处理结果(如图10)。

图4 服务器监听8000端口

图5 服务器接受到请求并响应请求

服务器端程序代码如下:

try{

gameServer gServer = new gameServer();//创建一个主类实例

gServer.newServerSocket(gServer.port);//监听gServer.port端口

while(true)//时刻等待客户端连接。

{

gServer.con = gServer.server.accept();//一旦有客户的请求,则接收客户请求。

multiRequest cThread=newmultiRequest(gServer.gSocket);//为处理客户端请求建立线程。

cThread.start();//启动线程处理客户端请求。

}

}catch(IOException e)//捕捉异常。

{

System.out.PRintln(“Creating socket error!!!”);

System.exit(1);

}

以下为multiRequest类的部分代码:

class multiRequest extends Thread

{

private Socket rSocket;

private DataInputStream is;

private DataOutputStream os;

String strReceive=null;

String strWhichService=null;

Private intType;

public multiRequest(Socket s)throws IOException//构造函数

{

rSocket = s;

inType = 0;

is = new DataInputStream(rSocket.getInputStream());//建立输入输出流。

os = new DataOutputStream(rSocket.getOutputStream());

}

public void run()

{

try{

strReceive=in.readUTF();

strWhichService=strReceive.substring(0,2);

//分离出用户向服务器发送子串的前两个字符,这个字符标志着用户请求的服务种类。

if(strWhichService.equals(“/r”)) intType=1;//请求注册服务。

else if(strWhichService.equals(“/s”) intType=2;//请求查询分数服务。

else if(strWhichService.equals(“/5”) intType=3;//请求五子棋服务。

……//请求其它服务(略)

switch(intType)

{

case 1: newUser();break;

case 2: findByGradeByUserID();break;

case 3: playWuzi();break;

default 0:displayError();break;

}

}catch(IOException e){}

finally

{

try{

rSocket.close();

}catch(IOException e){}

}

}

…………//(略)

}

由于手机端硬件的限制,所以,复杂的查找和处理都由配置较好服务器端处理。这样手机端可以减轻负担,专职处理界面的美观,以赢取客户的喜爱。例如,手机用户提出查分数请求时,手机向服务器发出请求“/s:user”。服务器接收到该子串,首先分离为“/s”和“user”,“/s”表示查询分数,“user”表示用户的ID。这时服务器端就调用findByGradeByUserID(),该函数利用JDBC连接数据库查询用户成绩,并将查询结果发送给客户端。

手机端编程

手机端的编程其实是MIDlet编程。MIDlet的程序流程是这样的:构造函数→startApp()→监听事件、接收命令→commandAction()方法→调用别的方法→假如是exit()命令调用pauseApp()→destroyApp()方法。以图形表示MIDlet的生命周期如图6所示。实际上,MIDlet程序的运行流程和Applet程序的运行流程差不多。

图6 生命周期

手机端程序举例如下:

import javax.microedition.lcdui.*;//用户界面包,主要用户构建用户的程序界面。

import javax.microedition.midlet.*;//MIDlet类。

import javax.microedition.io.*;//网络IO包。

……

public class MobileMIDlet extends MIDlet implements CommandListener

{

……//一些变量的声明(略)。

MobileMIDlet()

{

myDisplay = Display.getDisplay(this) ;

}

protected void startApp() throws MIDletStateChangeException

{

……//一些变量的初始化。

myDisplay.setCurrent(funcSelected);//设置当前显示界面为用户功能选择界面(图7)

}

……

public void commandAction(Command c,Displayable d)

{

if (d == funcSelected)//用户在主界面选择。

{

switch (((List)d).getSelectedIndex())

{

case 0://用户选择了游戏功能。

myCanvas = new ClientCanvas();

myDisplay.setCurrent(myCanvas);

break;

case 1://用户选择了查询。

myDisplay.setCurrent(SearchForm);

break;

……//其它选择略。

}

}else if(d==SearchForm)

{

if(c==okCommand){//假如用户点击了发送按钮(图9)。

try{

SendAndWaitAndDisplay();

//开始发送用户填写的资料,同时显示等待界面。

一旦接收到服务器发送过来的查询结果,则分析并且在手机上显示查询。

}catch(IOException e)

{

System.out.println(“error!”);}

}

}

……//略去其它处理

}

}//class

图7 功能选择界面图8 手写输入图9 提交查询

从以上程序段可以看出,手机端的程序主要是控件的部署和简单按钮动作的处理。由于手机硬件限制,手机端不可能进行复杂的操作,所以,对于数据库等类型的操作应该尽量放在服务器端处理,以减轻用户负担。

数据的发送与接收

利用服务器端和客户端建立的输入、输出流,可以轻松实现数据的在客户端和服务器端的收发工作。

图10 查询结果图11 联网游戏

程序段举例如下:

is = new DataInputStream(rSocket.getInputStream());//建立输入输出流。

os = new DataOutputStream(rSocket.getOutputStream());

……

//数据发送

try

{

os.writeUTF(sendMsg);//sendMsg为String类。用UTF编码发送数据.

os.Flash();

}catch(IOException e)

{

System.out.println(“Send msg error! ”);};

……

//数据接收

try

{

recMsg=in.readUTF();//将信息读入String recMsg中。

}catch(IOExcetpion e)

{

System.out.println(“Recevie msg error!”);

}

移动通信的迅速发展、手机用户骤然增加,必然使手机软件成为一个巨大的市场。与一般软件相比,更有发展潜力的网络游戏必然更具有开发潜力。利用本文介绍的程序可以构建一个手机联网游戏城,就像联众一样。不过连入的客户端不再是沉重的、移动不方便的PC,而是轻便的手机。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有