服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

用java自制手机联网游戏


  移动通信的迅速发展,使手机用户越来越多。手机制造商诺基亚曾宣称,计划在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所示。
   用java自制手机联网游戏(图一)
  图1 j2me的构架1
   用java自制手机联网游戏(图二)
  图2 j2me的构架2
  程序运行的环境
  客户端即为手机(需支持j2me的手机,例如motorola 388)用户,编程环境是windows 2000 server + motoj2sdk+jdk1.3.1+ms sql server2000,服务器端为windows 2000 server+jdk1.3.1。
  j2me编程流程
  以motoj2sdk的开发过程为例,其流程如下所示:
   用java自制手机联网游戏(图三)
  图3 j2me编程流程
  程序简介
  服务器端代码的编写
  客户端和服务器端采用socket连接。服务器端需要时刻监听客户的请求(如图4),一旦有客户需求,它就需要马上响应(如图5),并做出相应的处理,然后将结果返回给客户,客户显示服务器处理结果(如图10)。
   用java自制手机联网游戏(图四)
  图4 服务器监听8000端口
   用java自制手机联网游戏(图五)
  图5 服务器接受到请求并响应请求
  服务器端程序代码如下:
  
  try{
   gameserver gserver = new gameserver();//创建一个主类实例
   gserver.newserversocket(gserver.port);//监听gserver.port端口
   while(true)//时刻等待客户端连接。
   {
   gserver.con = gserver.server.accept();//一旦有客户的请求,则接收客户请求。
   multirequest cthread=new multirequest(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程序的运行流程差不多。
   用java自制手机联网游戏(图六)
  图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
   用java自制手机联网游戏(图七)
  图7 功能选择界面图8 手写输入图9 提交查询
  从以上程序段可以看出,手机端的程序主要是控件的部署和简单按钮动作的处理。由于手机硬件限制,手机端不可能进行复杂的操作,所以,对于数据库等类型的操作应该尽量放在服务器端处理,以减轻用户负担。
  数据的发送与接收
  利用服务器端和客户端建立的输入、输出流,可以轻松实现数据的在客户端和服务器端的收发工作。
  用java自制手机联网游戏(图八)
  图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,而是轻便的手机。

扫描关注微信公众号