J2ME网络连接架构

作者:袖梨 2023-08-11

网络联机对手机而言是非常重要的功能,一但手机支持网络存取的功能,再配合上手机既有的无线通讯能力,就能够随时随地的取得各种重要的信息,例如股市信息、银行交易等。java手机当然也支持网络连结,不过手机上的网络联机装置以及支持的通讯协议不像个人计算机那样标准化,因此j2me平台在设计网络功能时,特别考虑到对各种通讯方式的延伸性,这就是gcf网络连结架构,这篇文章就跟大家来谈谈gcf网络连结架构。

在j2se中的网络功能主要由java.net套件所提供,而j2me的网络功能由gcf网络连结架构来提供。gcf(generic connection framework)网络连结架构包含在javax.microedition.io套件内,主要由connector类别及connection接口和其子接口组成,connector类别是所有网络联机的建设类别,用来建立所有j2me所支持的网络联机方式,而connection接口和其子接口则代表实际的网络联机操作。

connector类别提供了三个类别方法来建立网络联机:

public static connection open(string url) throws ioexception

public static connection open(string url, int mode) throws ioexception

public static connection open(string url, int mode, boolean timeouts) throws ioexception

参数mode表示这个网络连结所允许的操作模式,允许的操作模式定义在connector类别内,共有read、write、read_write三种,表示只允许读取数据、只允许写入数据、同时允许读取及写入数据。参数timeouts表示是否要持续等待联机成功,如果为false的话,open()方法会一直等到联机成功之后才会返回,如果为true的话,open()方法会尝试一段时间,若在这段时间内失败就会丢出ioexception例外。参数url表示欲建立网络联机的url地址,其格式如下: " : // " 表示使用的通讯协议标识符,如"http"、"comm"等,表示欲存取资源所在装置的网络地址,可以是domain name(如www.j2mer.idv.tw)或ip位置(如123.123.123.123),而表示与该资源相关的参数。

目前在j2me平台内已经支持的网络连结类型如下(括号内的文字表示支持的profile或optional package版本):

http (midp 1.0/2.0) connector. open(http://www.j2mer.idv.tw);

https (midp 2.0) connector. open(https://www.j2mer.idv.tw);

串行端口 (midp 2.0) connector.open("comm:0;baudrate=9600");

datagrams (cldc 1.1) connector.open("datagram://123.456.789.12:1234 ");

server datagrams (cldc 1.1) connector.open("datagram://1234");

socket (midp 2.0) connector.open("socket:// www.j2mer.idv.tw:79");

server socket (midp 2.0) connector.open("socket://:1234 ");

ssl (midp 2.0) connector.open("ssl://host.com:79");

short message service (wma 1.0/1.1//2.0) connector.open("sms://+358401234567");

cell broadcast service(wma 1.0/1.1/2.0) connector.open("cbs://:3383");

multimedia message service (wma 2.0) connector.open("mms://+356728900:tw.idv.j2mer.messanger");

session initiation protocol (jsr 180) connector.open("sip://[email protected]:5060");

bluetooth(jsr 82) connector.open.("bt_spp://localhost:3b9fa89520078c303355aaa694238f07; anthenticate=true;encrypt=true");

当open()方法成功的被呼叫时会传回一个实作connection接口的对象,这个connection接口包含了和本次建立的联机类型相关的信息及操作。connection接口是所有与联机类型相关信息及操作的父接口,只定义了一个close()方法,用来关闭网络联机。在gcf架构中,任何与网络联机类型相关的信息及操作都应该直接或间接继承connection接口,以提供应用程处理特定的网络联机操作,让我们了解一下connection接口和其它子接口的关系,在cdc/cldc内定义的connection接口的继承关系图如下:

由这个图可以看出connection的子接口分成三大类,分别是streamconnection、streamconnectionnotifier和datagramconnection,大多数的网络联机类型都会继承这三类接口。

streamconnectionnotifier是以server模式建立的网络联机(等待外界连结到手机),streamconnection是以client模式建立的网络联机(主动连结到外部网络资源),而datagramconnection则是datagram-based的通讯方式,可以在client及server模式下建立。

sms和mms讯息服务及sip协议这些optional packages比较特殊,属于直接继承connection接口的第四类。 取得connection对象后,之后的所有工作就在这个connection对象上进行,我们以最常用的http联机为例,要与一个网络上的资源以http协议建立联机,你可以利用下列的程序代码:

httpconnection con = (httpconnection)connector.open(http://www.j2mer.idv.tw);

因为我们在open()方法内的url使用的通讯协议是别字是"http",所以虽然在api的定义上是传回实作connection接口的对象,但是实际上会传回实作connection的子接口httpconnection(继承contentconnection接口)的对象。一但取得实作httpconnection接口的对象,就可以利用httpconnection接口提供的方法进行与http联机相关的操作,例如我们可以设定本次http联机所使用的方法是get或是post,或是取得响应的状态码等等,如:

/* 设定http方法 */

con.setrequestmethod(httpconnection.get);

/* 取得回应的状态码 */

int code = con.getresponsecode();

 同样的,前面的说明可以知道gcf网络连结架构也能使用在简讯的收发(如果你的java手机支持wma1.0以上的版本),例如要建立一个发送简讯的网络联机,你可以利用下列的程序代码:

messageconnection con = (messageconnection)connector.open("sms://0912345678");

 messageconnection接口直接继承connection接口。一但取得实作messageconnection接口的对象,可以利用messageconnection接口提供的方法进行与简讯发送相关的操作,例如设定讯息格式是文字模式或是binary模式(透过建立message对象),以及填入讯息内容等,如:

/* 建立文字模式的简讯 */

textmessage msg = (textmessage)con.newmessage(messageconnection.text_message);

/* 填写简讯内容 */

msg.setpayloadtext("微型爪哇人");

/* 送出简讯 */

conn.send(msg);

 其它的网络联机方式也相同,在connector类别的open()方法中使用不同的通讯协议标识符会得到不同的connection对象,再利用该connection对象进行与该通讯协议相关的操作。

要在网络连结中读取或写入数据有两种方式,第一种是在利用connector类别建立网络连结时就以数据流形式读取或写入数据,connector类别提供四种方法提供相关的操作:

public static inputstream openinputstream(string name) throws ioexception

public static outputstream openoutputstream(string name)throws ioexception

public static datainputstream opendatainputstream(string name) throws ioexception

public static dataoutputstream opendataoutputstream(string name) throws ioexception

 参数name就是欲建立网络联机的url地址,利用这个方法就可以不用呼叫open()方法,直接建立网络联机并取得输入/输出数据流。一但取得了该网络连结的输入/输出数据流,就能够读取或写入数据。另一种方式是利用呼叫connector类别的open()方法取得的streamconnection对象。

 streamconnection接口提供四种方法提供与读取和写入相关的操作:

public inputstream openinputstream() throws ioexception

public outputstream openoutputstream()throws ioexception

public datainputstream opendatainputstream() throws ioexception

public dataoutputstream opendataoutputstream() throws ioexception

 剩下的事情就是对数据的处理了,这部份就必须要对使用的通讯协议有一定程度的了解。以上对gcf架构做一个概念性的介绍,在j2me应用程序内开发网络应用是非常简单的,不需要太多的程序代码就能完成联机的功能。

相关文章

精彩推荐