用 J2ME 进行联网.docx

上传人:b****5 文档编号:27840089 上传时间:2023-07-05 格式:DOCX 页数:12 大小:22.90KB
下载 相关 举报
用 J2ME 进行联网.docx_第1页
第1页 / 共12页
用 J2ME 进行联网.docx_第2页
第2页 / 共12页
用 J2ME 进行联网.docx_第3页
第3页 / 共12页
用 J2ME 进行联网.docx_第4页
第4页 / 共12页
用 J2ME 进行联网.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

用 J2ME 进行联网.docx

《用 J2ME 进行联网.docx》由会员分享,可在线阅读,更多相关《用 J2ME 进行联网.docx(12页珍藏版)》请在冰豆网上搜索。

用 J2ME 进行联网.docx

用J2ME进行联网

用J2ME进行联网

[录入者:

admin| 时间:

2006-04-1809:

51:

34|作者:

未知| 来源:

未知|点击数:

229]

[上一篇][下一篇]

在小型设备上获取Java网络应用程序

SomaGhosh(sghosh@)

应用程序开发人员,Entigo

2002年12月

如果您一直都在关注无线专区中SomaGhosh的文章,那么您就已经知道了如何使用您的Java技能来为手持设备构建简单的应用程序。

那您如何将那些设备连接到外部世界呢?

在本文中,Ghosh讨论了J2ME联网中至关重要的javax.microedition.io类和java.io类。

您将学习到J2ME应用程序如何处理URL和接受输入,本文甚至还会带您完成一个样本程序,这个程序把货币兑换信息下载到网络可访问的、遵循J2ME的任意设备上。

J2MEI/O与联网:

概览

Java2平台,袖珍版(Java2Platform,MicroEdition(J2ME))提供了把网络上可用的资源扩展到移动空间中的联网功能。

现在,在移动电话或掌上电脑获取实时股票报价或最新贷币汇率是可能的。

javax.microedition.io中的各个类和接口处理移动信息设备框架(MobileInformationDeviceProfile,MIDP)的联网功能,MIDP则是一个开发移动设备应用程序的平台。

(想了解更多有关MIDP的信息,请访问下面的参考资料部分,链接到我先前已发表在developerWorks上的关于这个主题的文章。

另一方面,java.io包给MIDP提供了输入/输出(input/output(I/O))功能。

它的各个类和接口为数据流提供了系统输入和输出。

这个J2ME包是Java2平台,标准版(Java2Platform,StandardEdition(J2SE))java.io包的一个子集,它处理低级别的数据I/O。

J2ME网络连接性最关键的方面是移动设备与Web服务器间的通信。

这种通信本质上是客户机/服务器机制,其中移动设备充当Web客户机的角色并有能力与企业系统、数据库、公司内部网和因特网建立接口。

J2ME联网活动可以按照通信协议分为许多种类别。

我们将在以下几部分中依次讨论每一种类别。

低级别的IP联网

这一类别涉及到套接字、数据报、串口和文件I/O通信。

基于套接字的通信遵循面向连接的TCP/IP协议。

另一方面,基于数据报的通信遵循无连接的UDP/IP协议。

UDP为应用程序提供了不必建立连接就能发送经过封装的原始IP数据报的方法。

面向连接的协议需要源地址和目的地址,与此不同,数据报只需要目的地址。

下面是数据报连接用来在某端口接受数据报的一个URI:

datagram:

//:

1234

更多精彩请关注

更多精彩请关注

更多精彩请关注

这里是数据报连接用来在某端口将数据报发送到服务器的一个URI:

datagram:

//123.456.789.12:

1234

低级别的IP联网还可以处理文件I/O并且能够允许MIDlet注册对本地串口进行网络访问。

安全联网

J2ME中的安全联网涉及到一些为了与基于Web的网络服务进行安全通信而提供的额外接口。

这些安全接口由IP网络上的HTTPS和SSL/TLS协议访问提供。

HTTP联网

移动设备与Web服务器之间基于HTTP(HypertextTransferProtocol,超文本传输协议)进行通信。

HTTP是一个面向连接的请求-响应(request-response)协议,在这个协议中,必须在发送请求之前设置请求的各参数。

图1说明了移动设备与Web服务器间的通信机制。

图1.移动设备与Web服务器间的连接机制

连接框架

J2ME联网旨在处理移动设备的广泛频谱不同的需要。

同时,联网系统必须是特定于设备的。

为了应付这些要求,J2ME联网引入了通用连接框架(genericconnectionframework)的概念。

通用连接框架的设想是以Java接口的形式定义一些能够覆盖联网和文件I/O的通用方面的抽象。

这个体系结构广泛支持各种手持设备,而将这些接口的实际实现留给了各个设备制造商。

设备制造商可以根据其设备的实际功能选择要在它的特定MIDP中实现哪个接口。

由Java接口定义的通用方面分为以下几种形式的基本通信类型:

基本串行输入(由javax.microedition.io.InputConnection定义)

基本串行输出(由javax.microedition.io.OutputConnection定义)

数据报通信(由javax.microedition.io.DatagramConnection定义)

用于客户机-服务器(client-server)通信的套接字通信通知机制(由javax.microedition.io.StreamConnectionNotifier定义)

与Web服务器进行的基本HTTP通信(由javax.microedition.io.HttpConnection定义)

J2ME中的URL处理

J2ME中的URL处理涉及到从移动设备打开一个到Web服务器的连接并处理移动设备到Web服务器间的数据I/O。

这个过程发生在下面的阶段:

建立(Setup),此时尚未建立到服务器的连接。

移动设备准备一堆请求参数并准备接受和解释随后的响应。

已连接(Connected),此时连接已经被建立,请求参数已经被发送并在期待响应。

已关闭(Closed),此时连接已经被关闭。

J2ME定义了javax.microedition.io.Connector类,这个类包含了用于创建所有连接对象的各个静态(static)方法。

这一任务是通过根据平台名称和所请求连接的协议动态地查找一个类来完成的。

在URL处理中,Connector.open()用来打开URL;它返回一个HttpConnection对象。

Connector.open()方法的字符串(string)参数是一个有效的URL。

URL字符串由于通信协议的不同而不同,下面的清单1到清单5演示了这一点。

清单1.调用基于HTTP的通信

Connectionconn=Connector.open("");

清单2.调用基于流的套接字通信

Connectionconn=Connector.open("socket:

//localhost:

9000");

清单3.调用基于数据报的套接字通信

Connectionconn=Connector.open("datagram:

//:

9000");

清单4.调用串口通信

Connectionconn=Connector.open("comm:

0;baudrate=9000");

清单5.调用文件I/O通信

Connectionconn=Connector.open("file:

//myfile.dat");

Connector.open()方法还可以接受访问模式(值为READ、WRITE和READ_WRITE)以及一个用来表示调用者想要得到超时通知的标志。

在安全的联网中,当https:

//连接字符串被访问时,Connector.open()就会返回HttpsConnection。

当ssl:

//连接字符串被访问时,Connector.open()就会返回SecureConnection。

无论使用哪一种类型的URL,调用Connector.open()都会打开一个从Connection到java.io.InputStream的字节输入流。

这个方法用来读取文件的每一个字符,一直读到文件末尾(以-1为标志)。

如果抛出一个异常,连接和流就会被关闭。

与此相似,为了进行输出,代表字节输出流的java.io.OutputStream将被从Connection打开。

InputStream和OutputStream分别与java.io.DataInputStream和java.io.DataOutputStream相对应。

DataInputStream让应用程序用与机器无关的方式从底层输入流读取基本的Java数据类型。

java.io.DataOutputStream让应用程序用可移植的方式把基本的Java数据类型写到输出流。

清单6说明了如何使用HttpConnection从URL输入数据。

清单6.使用HttpConnection从URL输入数据

StringgetViaHttpConnection(Stringurl)throwsIOException{

   HttpConnectionc=null;

   InputStreamis=null;

    StringBufferstr=newStringBuffer();

    try{

      c=(HttpConnection)Connector.open(url);

     //GettingtheInputStreamwillopentheconnection

     //andreadtheHTTPheaders.Theyarestoreduntil

     //requested.

     is=c.openInputStream();

    

     //Getthelengthandprocessthedata

    intlen=(int)c.getLength();

    intch;

    while((ch=is.read())!

=-1){

     str.append((char)ch);

    }

    

   }finally{

   if(is!

=null)

    is.close();

   if(c!

=null)

    c.close();

  }

一个贷币兑换应用程序

我们将通过一个贷币兑换应用程序来说明迄今为止所概述过的概念,这个应用程序将会显示美元(U.S.dollar,USD)和英镑(Britishpound,GBP)之间最新的汇率。

这个应用程序还会显示任意与当前日期和当前时间相关的信息。

这个应用程序的UI由一个表单(Form)和一个退出(exit)命令组成,该表单嵌入了代表一个只显示字符串的StringItem,退出命令用于完成调用时让应用程序退出。

一旦启动应用程序,URL请求便已准备就绪。

基本的货币符号被提供给请求。

接下来,我们需要打开一个移动设备与Web服务器间的URL连接。

打开一个HttpConnection并为数据输入建立一个InputStream。

所获得的数据是一个字符流,这个多字符流附加在String中。

产生的String代表HTML输出。

由于我们的移动设备上的浏览器不能显示HTML,因而我们将解析HTMLString来获取货币值以及任何相关的信息。

我们的程序将在HTMLString中搜索一个特定模式,即USDGBP。

一旦确定了这个模式的位置,搜索便查找十进制值。

当获得了小数点的位置后,各个数字值便会被检索并以适当的顺序排列,从而获取货币值。

清单7说明了如何获取货币值。

清单7.检索货币值

    StringretVal="";

    intdec=0;

    intindex=str.indexOf("USDGBP");

    if(index!

=-1)

      str=str.substring(index,str.length());

    if(((dec=str.indexOf("."))!

=-1)&&(!

(str.endsWith(".")))

    &&Character.isDigit(str.charAt(dec+1)))

{

Stringfront="";

intfind=dec-1;

while(Character.isDigit(str.charAt(find)))

{

 front+=str.charAt(find);

 find--;

 }

retVal+=newStringBuffer(front).reverse().toString();

retVal+=".";

Stringback="";

intbind=dec+4;

while(Character.isDigit(str.charAt(bind)))

 {

 back+=str.charAt(bind);

 bind--;

 }

retVal+=newStringBuffer(back).reverse().toString();

}

相关信息也是通过查找某些特定的字符串模式来获取的。

一旦确定了数据在HTMLString中的位置,一个偏移量便会被应用来获取日期和时间。

这个信息被与原先用于搜索的字符串模式附加在一起。

清单8说明了如何获取相关信息。

清单8.检索相关信息

//GetthetimeofCurrencyExchangeandRelatedinformation

inttimeIndex=str.indexOf("U.S.MarketsClosed.");

StringretTime="";

if(timeIndex!

=-1)

{

 retTime=str.substring(timeIndex-34,timeIndex);

 retTime+="U.S.MarketsClosed";

}

清单9包括货币兑换应用程序的全部代码。

清单9.完整的货币兑换示例

importjavax.microedition.midlet.*;

importjavax.microedition.lcdui.*;

importjavax.microedition.io.*;

importjava.io.*;

importjava.lang.*;

importjava.util.*;

//AfirstMIDletwithsimpletextandafewcommands.

publicclassCurrencyExchangeextendsMIDlet

     implementsCommandListener{

//Theexitcommands

privateCommandexitCommand;

//ThedisplayforthisMIDlet

privateDisplaydisplay;

FormdisplayForm;

publicCurrencyExchange(){

 display=Display.getDisplay(this);

 exitCommand=

 newCommand("Exit",Command.SCREEN,1);

}

//StarttheMIDletbycreatingtheFormand

//associatingtheexitcommandandlistener.

publicvoidstartApp(){

 displayForm=newForm("ExchangeRate");

 displayForm.addCommand(exitCommand);

 displayForm.setCommandListener(this);

try

{

 Stringresult=getViaHttpConnection

 ("

 displayForm.append(""+result);

}

catch(Exceptionexc)

{

 exc.printStackTrace();

}

display.setCurrent(displayForm);

}

 //Pauseisano-opbecausethereisno background

//activitiesorrecordstorestobeclosed.

publicvoidpauseApp(){}

//Destroymustcleanupeverythingnothandled

//bythegarbagecollector.

//Inthiscasethereisnothingtocleanup.

publicvoiddestroyApp(booleanunconditional){}

//Respondtocommands.Hereweareonlyimplementing

//theexitcommand.Intheexitcommand,cleanupand

//notifythattheMIDlethasbeendestroyed.

publicvoidcommandAction(

Commandc,Displayables){

 if(c==exitCommand){

 destroyApp(false);

 notifyDestroyed();

 }

}

Stringparse(Stringstr)

{

 //GetthetimeofCurrencyExchangeandRelatedinformation

 inttimeIndex=str.indexOf("U.S.MarketsClosed.");

 StringretTime="";

 if(timeIndex!

=-1)

 {

 retTime=str.substring(timeIndex-34,timeIndex);

 retTime+="U.S.MarketsClosed";

 }

 StringretVal="";

 intdec=0;

 intindex=str.indexOf("USDGBP");

 if(index!

=-1)

 str=str.substring(index,str.length());

if(((dec=str.indexOf("."))!

=-1)&&(!

(str.endsWith(".")))

&&Character.isDigit(str.charAt(dec+1)))

{

 Stringfront="";

 intfind=dec-1;

 while(Character.isDigit(str.charAt(find)))

 {

  front+=str.charAt(find);

  find--;

 }

 retVal+=newStringBuffer(front).reverse().toString();

 retVal+=".";

 Stringback="";

 intbind=dec+4;

 while(Character.isDigit(str.charAt(bind)))

 {

 back+=str.charAt(bind);

 bind--;

 }

 retVal+=newStringBuffer(back).reverse().toString();

}

System.out.println(retVal);

return"USD/GBP"+retVal+"at"+retTime;

}

StringgetViaHttpConnection(Stringurl)throwsIOException{

   HttpConnectionc=null;

   InputStreamis=null;

   StringBufferstr=newStringBuffer();

   try{

    c=(HttpConnection)Connector.open(url);

    //GettheContentType

    Stringtype=c.getType();

    //GettingtheInputStreamwillopentheconnection

    //andreadtheHTTPheaders.Theyarestoreduntil

    //requested.

    is=c.openInputStream();

    

    //Getthelengthandprocessthedata

    intlen=(int)c.getLength();

    intch;

    while((ch=is.read())!

=-1){

      str.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1