游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1765|回复: 0

开发MIDP联网应用程序 1 wxh zt

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2006-4-19 15:02:00 | 显示全部楼层 |阅读模式
作者:未知 文章来源:nec ♦ 引言
  在上讲中,我们介绍了如何利用Record Store把数据保存在终端内。本讲,我们将阐述MIDP JAVA网络的相关功能。由于N800终端只能使用HTTP通信,所以我们将以HTTP为主要范例进行讲解。到目前为止,只能制作终端内的单机型应用程序,如果利用网络,连接网络服务器,那么就能够制作出多种应用程序。

1. 利用网络
  1.1. Generic Connection Frame Work
  J2ME应该能支持各种手机终端。由于终端不同其网络功能及文件I/O功能也迥然不同,网络和文件I/O关联的图书馆所需的条件也不同。

  为了解决上述问题,JSME的CLDC采用了Generic Connection framework。Generic Connection framework拥有不同终端所需的省空间网络功能以及文件I/O功能。广泛应用J2SE的java.io和java.net包里的网络、文件I/O功能,并准备7个interface。这样,为能支持各种手机终端的通信功能,只限定interface,在每个手机终端上都能自由安装。不支持手机终端连接的实际安装不能进行。各种interface的说明如表1所示、层次结构如图1所示。

Interface   作用
Connection  成为其他interface基础的interface
StreamConnectionNotifier  具有socket通信连接通知功能的interface
InputConnection  具有接收数据功能的interface
OutputConnection  具有发送数据功能的interface
DatagramConnection  具有连接UDP的数据电报通信功能的interface
StreamConnection  具有socket通信接收/发送功能的interface
ContentConnection  具有通信内容调查功能的interface
HttpConnection  具有http通信功能的interface

表 1

图 1
  1.2. Connection Interface
  Connection interface在Generic Connection framework中是连接interface的基础interface。其他的连接interface是从Connection interface派生而来的。

  1.3. Connector 类
  使用Connector类的static方法open (String connectString)入网。

Connection con = Connector.open("http://www.nec-mfriend.com/");

ex. 1

  例如、如ex. 1所示,在open方法的自变量中输入“http://www.nec-mfiend.com/”,就可以实现与www.nec-mfriend.com服务器进行http通信。
  而Generic Connection framework的全部链接都是利用Connector类的open方法完成的。也就是说,即使链接类型不同,也能以同样的方法完成。J2ME由于这样的设计而拥有丰富的扩展性,对于上述新的装置它也配备了简单的支持系统。
  按照下述形式指定Open方法的自变量。

{protocol}:[{target}][{params}]

在Protocol部分可以指定如下所示的Protocol。  值  链接方式
file  文件 I/O
comm.  串行端口通信
socket  Socket通信
datagram  数据电报通信
http  Web服务器通信


表 2
*N800不支持socket通信、数据电报通信,而N820支持socket通信。

  在Target部分指定服务器的用户名、端口号和文件名等。若有必要的添加信息则在Params部分指定。

  Open方法也可以指定其他的自变量。

    static Connection open(String connectString, int mode)

从connectString中制作Connection、打开链接,若要使用mode链接则需指定access mode。在access mode中,可以指定Connector.READ,Connector.READ_WRITE和Connector.WRITE ,若不指定,则为Connector.READ_WRITE 。在Protocol中不能指定access mode时,则放弃IllegalArgumentException。

  下表是其他Connector类的static方法。  方法  作用
DataInputStream openDataInputStream(String connectString)  从connectString中制作新的DataInputStream 并打开。
DataOutputStream openDataOutputStream(String connectString)  从connectString中制作新的DataOutputStream并打开。
InputStream openInputStream(String connectString)  从connectString中制作新的InputStream并打开。
OutputStream openOutputStream(String connectString)  从connectString中制作新的OutputStream并打开。


  1.4. HTTP 通信
  现在,我们对N800所支持的HTTP通信进行阐述。利用HTTP通信可以连接WEB服务器。例如,可以把手机终端难以处理的复杂问题交给WEB服务器处理,得出结果。HTTP通信采用MIDP方法作为标准,但是,采用MIDP作为基本方法的终端却不能进行HTTP通信,或者有很大的限制,这一点请注意。

为能在N800中使用HTTP通信需遵从以下规定。
• 要实现MIDlet通信必须在JAD(ADF)文件中设定MIDlet-UseNetwork(参考3.JAD(ADF)文件)为YES。.
• 最大发送量为10kbyte。
大于10kbyte时,超出部分被清除,小于10kbyte的数据才是有效的。
• 最大接收量为100kbyte。
大于100kbyte时,超出部分被清除,小于100kbyte的数据才是有效的。
• 连接处URL
从http://开始,包含http://,最多为512byte。不分大/小写。

  HTTP通信由request和response两部分组成。从客户发出的request信息传到服务器,服务器接收request,返还response信息。

  HTTP通信主要有下述三种request方式。  方式  作用
GET  要求指定的文件。
HEAD  要求指定文件的header信息。
POST  要求向指定文件发送信息,并得出结果。


接下来,让我们试着用多种request与服务器进行通信。

  1.5. 利用GET
    利用GET可以读取服务器上的文件。在使用GET之前,如下所示需在已完成的HttpConnection方法的setRequestMethod方法中,指定HttpConnection的static变数GET。

HttpConnection con = (HttpConnection)Connector.open("http://www.nec-mfriend.com/");
con.setRequestMethod(HttpConnection.GET);


ex. 2
    如下所示可以利用DataInputStream获取response。

String res="";
DataInputStream in = con.openDataInputStream();
int input;
while((input = in.read())!=-1){
res = res + (char)input;
}
in.close();

ex. 3
   以下实际是与服务器通信,获取html文件的sample。为简单介绍sample的操作,得把通信结果,即获取的html文件内容,输入控制台。因此,此sample是以在模拟器上面操作为前提的。

import java.io.DataInputStream;
import java.io.IOException;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


/**
* 利用GET发送request的sample
* 从控制台输出response
*/
public class GETTest extends MIDlet {

   /**
  * 访问服务器
  */
  protected void startApp() throws MIDletStateChangeException {

  try {
    HttpConnection con = (HttpConnection)Connector.open("http://www.nec-mfriend.com/en/ ");

    //指定GET
    con.setRequestMethod(HttpConnection.GET);

    DataInputStream in = con.openDataInputStream();
    int input;
    while((input = in.read())!=-1){
      System.out.print((char)input);
    }
    in.close();

    //关闭链接
    con.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  protected void pauseApp() {
  }
  protected void destroyApp(boolean arg0) throws MIDletStateChangeException   {
  }
}




ex. 4
  实际操作后的结果。


1.6. 利用HEAD
  接下来介绍如何利用HEAD方法获取文件的header。多数情况下,在HTTP header中,包含了文件种类、尺寸大小、文字编码、回复日期、request文件的最后修改时间、以及兑现期限的截止日期等。一般来讲,使用HEAD方法检查其是否对兑现内容进行了新信息的替换。

为使用HEAD,如下所示要在作成的HttpConnection的setRequestMethod方法中,指定HttpConnection的static变量HEAD。

HttpConnection con = (HttpConnection) Connector.open("http://www.nec-mfriend.com/en/");
con.setRequestMethod(HttpConnection.HEAD);

  获取HEAD信息的方法。  方法   
String getHeaderField(int index)  取得由indexheader field指定的header field值
String getHeaderField(String name)  取得name指定的header field值
String getHeaderFieldKey(int index)  取得index指定的header field名
long getLength()  取得content-length值
String getType()  取得content-typeencoding值
String getEncoding()  取得content-encoding值
int getResponseCode()  取得应答HTTP的status code
String getResponseMessage()  取得应答HTTP的信息
int getHeaderFieldInt(String name,long def)  在int上取得name指定的header field值。错误时,返还def。
long getHeaderFieldDate(String name, long def)  在long上取得name指定的header field值。错误时,返还def。


表 3
  下面是利用getHeaderField方法和getHeaderFieldKey方法,获取全部header信息的sample。这个sample与刚才所介绍的一样,是以在模拟器上进行操作为前提而作成的,它只用于说明,实际操作还没有进行测定。由此获取的全部header信息内容将输入控制台。

import java.io.IOException;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

/**
* 利用HEAD发送request的sample
* 从控制台输出response
*/
public class HEADTest extends MIDlet {

    /**
    * 显示header信息
    */
    protected void startApp() throws MIDletStateChangeException {

      try {
        HttpConnection con =
    (HttpConnection) Connector.open("http://www.nec-mfriend.com/en/");

//指定HEAD
        con.setRequestMethod(HttpConnection.HEAD);

        //取得关键的HTTP header信息——成对的值
        int i = 0;
        String message = "";
        String key = "";
        String value = "";
        while((value=con.getHeaderField(i))!= null){
          key = con.getHeaderFieldKey(i++);
          message = message + key+":"+value+"\n";
        }
        System.out.println(message);

        //关闭链接
        con.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    protected void pauseApp() {
  }
  protected void destroyApp(boolean arg0) throws MIDletStateChangeException   {
  }
}


ex. 5
   实际操作后的结果如下所示。


图 3
  1.7. 利用POST
  为能利用POST发送request,要使用InputStream和OutputStream 。用OutputStream向服务器发送数据,而InputStream则接收来自服务器的response。

  用下述方法指定POST。

HttpConnection con = (HttpConnection) Connector.open("http://www.yahoo.com");
con.setRequestMethod(HttpConnection.POST);

ex. 6
  如下所示使用OutputStream在requeat信息中输入数据,使输入数据为(message=helloworld),而变量con是指定了POST的HttpConnection。

String message=?hmessage=helloworld?h;
DataOutputStream dos = con.openDataOutputStream();
byte[] request = message.getBytes();
for(int i=0;i<request.length;i++){
dos.writeByte(request);
}
dos.flush();



ex. 7
  下面实际是利用POST与服务器进行通信的sample。在这里,WEB服务器将转发利用POST发送的信息值,并接收最终结果response。接收的response内容将被输入控制台,请用模拟器进行确认。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


/**
* 利用POST发送request的sample
* 从控制台输出response
*/
public class POSTTest extends MIDlet {

  /**
  * 利用POST送信息
  */
  protected void startApp() throws MIDletStateChangeException {

    try {
      HttpConnection con = (HttpConnection)Connector.open("http://localhost:8080/nec_server/servlet/ReverseServlet");

      //指定POST
      con.setRequestMethod(HttpConnection.POST);

      //在request中输入数据
      String message ="message=helloworld";
      DataOutputStream dos = con.openDataOutputStream();
      byte[] messageByte = message.getBytes();
      for(int i=0;i < messageByte.length;i++){
        dos.writeByte(messageByte);
      }
      dos.flush();
      dos.close();

      //接收response
      DataInputStream in = con.openDataInputStream();
      int input;
      while((input = in.read())!=-1){
        System.out.print((char)input);
      }
      in.close();

      //关闭链接
      con.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  protected void pauseApp() {
  }
  protected void destroyApp(boolean arg0) throws MIDletStateChangeException   {
  }
}



ex. 8
  接下来介绍本次使用的SERVLET sample,作为服务器实际安装的例子。因为本讲座是MIDP讲座,所以关于SERVLET的详细说明就不再赘述,网上有许多这方面的信息,请大家参考Sun —http://java.sun.com/products/servlet/等网站。

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
* 把接收的文字列进行转发的SERVLET
*/
public class ReverseServlet extends HttpServlet {

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 07:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表