摘要:隨著移動通信技術(shù)的發(fā)展,從移動設(shè)備上訪問網(wǎng)絡(luò)變得越來越重要。Sun公司針對嵌入式和移動設(shè)備推出的J2ME提供了開發(fā)和運(yùn)行應(yīng)用程序的平臺,但由于運(yùn)行J2ME程序的設(shè)備是資源有限的,因此了解J2ME的網(wǎng)絡(luò)編程對開發(fā)人員來說是非常必須的。
關(guān)鍵詞:J2ME;CLDC;MIDP;HTTP
中圖分類號:TP312文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)28-0111-02
The Research and Application of J2ME Network Program
DU Rui
(School of Electronics and Information,Jiangsu University of Science and Technology,Zhenjiang 212003,China)
Abstract:Along with rapid development of mobile communication technology,it is becoming increasingly important to visit the Internet from the mobile device.J2ME is the platform to develop and run the J2ME application provided by the Sun Microsystems,which aims at the built-in and mobile devices.But it is the CLDC device that run the J2ME application,so it is necessary to understand how to develop the J2ME network program for developers.
Key words:J2ME;CLDC;MIDP;HTTP
1 引言
J2ME[1] (Java 2 Micro Edition)是Sun公司針對各種小型消費(fèi)電子產(chǎn)品推出的Java開發(fā)平臺,是一種高度優(yōu)化的Java運(yùn)行環(huán)境,主要針對消費(fèi)類電子設(shè)備的,例如蜂窩電話、可視特性移電話、數(shù)字機(jī)頂盒和汽車導(dǎo)航系統(tǒng)等等。Java語言的與平臺無關(guān)的植到小型電子設(shè)備上,允許移動無線設(shè)備之間共享應(yīng)用程序。J2ME的出現(xiàn)使開發(fā)跨平臺的消費(fèi)類電子產(chǎn)品的應(yīng)用軟件成為可能。
隨著Internet網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,基于互聯(lián)網(wǎng)的無線應(yīng)用范圍不斷擴(kuò)展,網(wǎng)絡(luò)已從有線連接朝著無線和移動方向發(fā)展。在將來的無線通信時代中,大量的網(wǎng)絡(luò)應(yīng)用程序?qū)⒈婚_發(fā)出來以滿足無線移動通訊的要求,而要充分的發(fā)揮無線移動通訊設(shè)備的通信能力,J2ME網(wǎng)絡(luò)編程就變得尤為重要。
2 J2ME的體系結(jié)構(gòu)
隨著Java技術(shù)的不斷發(fā)展,針對不同領(lǐng)域的需求,Java自身被分成三個版本:J2EE (企業(yè)版)、J2SE (標(biāo)準(zhǔn)版)、J2ME ( 微型版,嵌入式設(shè)備及消費(fèi)類電子產(chǎn)品級應(yīng)用)。前兩個版本分別是針對企業(yè)開發(fā)和桌面開發(fā)而設(shè)計(jì)。J2ME定位在消費(fèi)類電子產(chǎn)品的應(yīng)用上,這個版本針對資源有限的電子消費(fèi)產(chǎn)品的需求精簡核心類庫,并提供了模塊化的架構(gòu),以便讓不同類型產(chǎn)品能夠隨時增加支持的能力。
在 J2ME 規(guī)范中, J2ME 的體系結(jié)構(gòu)劃分為兩個大模塊, 即配置(Configuration) 和描述(Profile)。配置是用于一組通用設(shè)備的最小的 Java 平臺, 而描述則為具體的系列設(shè)備或特別的應(yīng)用程序提供更具體的能力。J2ME使用配置和描述針對不同類型的設(shè)備定制Java運(yùn)行時環(huán)境(JRE)。作為一個完整的JRE, J2ME由配置和簡表組成,配置決定了運(yùn)行環(huán)境所使用的Java虛擬機(jī)(JVM),而簡表通過添加特定于域的類來定義應(yīng)用程序。到目前為止,J2ME規(guī)范定義的配置只有兩種:一種是Connected Limited Device Configuration ( CLDC,連接有限設(shè)備配置),致力于低端的消費(fèi)類設(shè)備,特點(diǎn)是512 KB 以下內(nèi)存、有限能源供應(yīng)(通常使用電池)、有限或非持續(xù)網(wǎng)絡(luò)連接、簡單的用戶界面、16位或者32位的處理器,比如手機(jī)、PDA、雙向?qū)ず魴C(jī)等;另一種是Connected Device Configuration ( CDC,連接設(shè)備配置),致力于高端消費(fèi)類設(shè)備,特點(diǎn)是2M以上內(nèi)存、具有網(wǎng)絡(luò)連接能力,通常為無線網(wǎng)絡(luò) 、需要實(shí)現(xiàn)java虛擬機(jī)規(guī)范的全部功能、32位或者64位的處理器,比如機(jī)頂盒、汽車導(dǎo)航系統(tǒng)等。J2ME 的描述層[2] (Profile) 是定義在配置層之上, 它主要提供配置層中所缺少的功能以支持特定的設(shè)備。這些功能包括對 UI 和對持續(xù)性存儲的支持等, 它比配置層的針對性更強(qiáng)。其中,MID Profile(移動信息設(shè)備描述 Mobile Information Device Profile, 簡稱 MIDP)是目前 J2ME 平臺中發(fā)展相對最成熟的 Profile。與配置的縱向特性不同的是,簡表是橫向的。圖1是J2ME體系結(jié)構(gòu)的框圖。
3 J2ME的網(wǎng)絡(luò)編程
回顧手機(jī)的發(fā)展歷史,手機(jī)上應(yīng)用軟件的發(fā)展也經(jīng)歷了3個階段[3]。傳統(tǒng)的手機(jī)通常只有通話和短消息功能,只能提供基本的語音服務(wù)。隨后手機(jī)上又增加了一些簡單的附加應(yīng)用,如電話簿和電話鈴聲編輯功能等。隨著WAP技術(shù)的發(fā)展,手機(jī)增加了訪問Internet的功能,使用戶可以直接在手機(jī)上以無線方式瀏覽網(wǎng)頁。WAP包括兩層內(nèi)容:一層是傳輸層,針對無線的特點(diǎn)制定了WDP和WTP等協(xié)議;另一層是應(yīng)用層,也就是WAP Browser,WAP為了適應(yīng)低速網(wǎng)絡(luò)的限制,簡化了Internet標(biāo)準(zhǔn)的HTML,制定了WML標(biāo)準(zhǔn)。然而,隨著無線Internet新應(yīng)用的出現(xiàn),新的問題也隨之而來。
手機(jī)訪問Internet通過WAP方式,而WAP采用Browser/Server方式訪問Internet卻功能有限。因?yàn)楝F(xiàn)在的WAP解決方案要求手機(jī)通過WAP網(wǎng)關(guān)才能訪問Internet,而且只能訪問WML而不是主流的HTML,也不能顯示復(fù)雜格式的圖形。此外,因?yàn)楝F(xiàn)有的WAP解決方案不夠智能,而且不能訪問本地存儲區(qū),如果進(jìn)行在線交易會增加服務(wù)器負(fù)荷,反應(yīng)速度慢,使無線Internet應(yīng)用受到了很大的限制。
J2ME的出現(xiàn)則使上述問題迎刃而解。J2ME的MIDP在javax.microedition.io程序包中提供了一整套類,統(tǒng)稱為通用連接構(gòu)架(Generic Connection Framework ,GCF),該架構(gòu)用于定義一種設(shè)備必須支持何種通信協(xié)議。MIDP規(guī)范只要求支持一種網(wǎng)絡(luò)協(xié)議,即HTTP1.1協(xié)議的子集,而HTTP協(xié)議正是一種用于在客戶端和服務(wù)器端交換任意形式數(shù)據(jù)的非常靈活的協(xié)議。J2ME在傳輸層實(shí)現(xiàn)了HTTP協(xié)議,實(shí)際的傳輸可以基于WAP實(shí)現(xiàn),也可以基于其他方式(如CSD、GPRS等);在應(yīng)用層提供了全功能的Java開發(fā)環(huán)境,使手機(jī)能以Client/Server方式直接訪問Internet的信息,從而使得不同的Client訪問不同的資源。J2ME 是一種專用于智能應(yīng)用程序的開發(fā)平臺,J2ME 應(yīng)用程序比基于WAP構(gòu)建的應(yīng)用程序提供了更多的功能,最主要的優(yōu)點(diǎn)是J2ME應(yīng)用程序能夠在本地存儲和處理數(shù)據(jù),因此減少了網(wǎng)絡(luò)流量,節(jié)省了寶貴的無線帶寬和減少了延遲時間。Java 2標(biāo)準(zhǔn)版( J2SE)在java.io和java.net程序包中定義了100多個接口程序,類和異常。通過這些庫所實(shí)現(xiàn)的功能是很強(qiáng)大的,J2ME定義了這些函數(shù)的子集,并提供了一套用于網(wǎng)絡(luò)和文件訪問的固定的程序包javax.microedition.io程序包。下面給出了一個使用HTTP協(xié)議的客戶端和服務(wù)器端的代碼:
1) J2ME的客戶端
//返回一個HttpConnection類型的值
public HttpConnection openConnection(String url) throws IOException {
try { HttpConnection connection = (HttpConnection) Connector.open(serviceURL);
connection.setRequestProperty(\"User-Agent\",\"MOBILE1.0/MIDP-2.0 Configuration/CLDC-1.1\");
connection.setRequestProperty(\"Content-Type\",\"application/octet-stream\");
connection.setRequestMethod(HttpConnection.POST);
offline = 1;
return connection;
} catch (IOException ioe) {
offline = true;
throw ioe;}
}
//客戶端發(fā)送請求
public boolean login(String userName, String password) {
try {connection = openConnection(url);
outputStream = openConnectionOutputStream(connection);
outputStream.writeByte(MessageConstants.OPERATION_LOGIN_USER);
if (conn.getResponseCode()== HttpConnection.HTTP_OK) {
… …
} catch (IOException ioe) {
}
}
2) 服務(wù)器端
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
response.setContentType(\"application/octec-stream\");
InputStream is=request.getInputStream();
OutputStream os=response.getOutputStream();
DataInputStream call=new DataInputStream(is);
DataOutputStream result=new DataOutputStream(os);
byte method=call.readByte();
//根據(jù)傳過來的數(shù)據(jù),調(diào)用相應(yīng)的方法
response.setContentLength(result.size());
}
在這個例子中,當(dāng)J2ME客戶端使用HTTP協(xié)議向服務(wù)器發(fā)送數(shù)據(jù)時,采用的是POST方式。這個方式可以傳遞任意格式的數(shù)據(jù)(包括二進(jìn)制),并且傳送的數(shù)據(jù)沒有大小限制。設(shè)置好數(shù)據(jù)傳輸方式后,接下來應(yīng)該設(shè)置正確的HTTP頭。當(dāng)客戶端向服務(wù)器發(fā)送數(shù)據(jù)時,采用的格式是一個重要的問題。只有數(shù)據(jù)采用了客戶端和服務(wù)器都能理解的格式,數(shù)據(jù)才能被正確發(fā)送。使用XML作為數(shù)據(jù)格式是一個比較好的,但是比較復(fù)雜。除了XML外,一個比較好的選擇就是使用DataOutputStream和DataInputStream類的編碼和解碼功能來進(jìn)行數(shù)據(jù)傳遞。
在服務(wù)器端同樣有接收和發(fā)送數(shù)據(jù)的問題。服務(wù)器可以使用Jsp或Pearl來實(shí)現(xiàn)接收和發(fā)送數(shù)據(jù),但為了保持便捷性和一致性,上例使用了servlet。服務(wù)器接收數(shù)據(jù)時可以用InputStream來讀取數(shù)據(jù)。當(dāng)發(fā)送數(shù)據(jù)時,首先應(yīng)向客戶端發(fā)送數(shù)據(jù)的MIME類型,接下來發(fā)送實(shí)際的數(shù)據(jù)了。在仿真器中,程序可以通過Internet快速的連接服務(wù)器。但由于手機(jī)是資源有限設(shè)備,基于以上分析,在手機(jī)運(yùn)行程序時可能會出現(xiàn)無法連接無線網(wǎng)絡(luò)的情況。由于HTTP是一個基于文本的效率較低的協(xié)議,因此,必須仔細(xì)考慮手機(jī)和服務(wù)器端的通信內(nèi)容,盡可能地提高效率。
4 J2ME網(wǎng)絡(luò)編程存在的問題及解決方案
在MIDP上開發(fā)出來的應(yīng)用程序被稱為MIDlet,這些 MIDlet可以通過擴(kuò) CLDC/MIDP 的包獲得支持,運(yùn)行在手機(jī)、PDA等資源有限設(shè)備上,因此MIDlet所運(yùn)行的硬件環(huán)境和網(wǎng)絡(luò)環(huán)境都無法與桌面系統(tǒng)相比。當(dāng)在手機(jī)上運(yùn)行MIDlet程序時受到許多限制,主要問題包括:存儲空間小,由于異常處理代碼的不斷增加,消息的持久存儲,J2ME應(yīng)用程序也相應(yīng)的越來越膨脹,以致于手機(jī)上可以存儲程序所需內(nèi)存相對較小,不能將大部分文件放在客戶端而只能放在服務(wù)器上,使用時下載到設(shè)備上;內(nèi)存及處理器性能受限,只能將大部分復(fù)雜的運(yùn)算分配給服務(wù)器處理,設(shè)備只需要接受返回結(jié)果;通過無線網(wǎng)絡(luò)傳輸客戶端請求和服務(wù)器端響應(yīng)的數(shù)據(jù)比通過有線網(wǎng)絡(luò)傳輸要慢得很多;在目前的條件,手機(jī)和無線網(wǎng)絡(luò)經(jīng)常會斷開也是很“正?!钡那闆r;由于無線網(wǎng)絡(luò)的帶寬起伏較大,會使得使用request/response方式傳輸數(shù)據(jù)的應(yīng)用程序經(jīng)常會中斷響應(yīng)。
當(dāng)然,我們可以通過優(yōu)化代碼讓MIDlet應(yīng)用程序的體系結(jié)構(gòu)變得簡捷,通過修正程序的功能實(shí)現(xiàn)來去掉多余的代碼,為更好的實(shí)現(xiàn)傳送數(shù)據(jù)的功能而在服務(wù)質(zhì)量上做出讓步,使得應(yīng)用程序更好的運(yùn)行在設(shè)備上。但是一個需要考慮的主要問題,無線網(wǎng)絡(luò)是不可靠的,在這樣的環(huán)境下運(yùn)行應(yīng)用程序應(yīng)該有一個優(yōu)化的無線通信模塊。因?yàn)橄鄬τ诳煽坎⑶铱焖俚腎nternet,GPRS的傳輸速率[4]只有56Kbps至114Kbps,即使TDMA幀的8個時隙都用來傳送數(shù)據(jù),那么數(shù)據(jù)速率也只達(dá)到164Kbps。
為盡可能提高效率,以下是在設(shè)計(jì)J2ME程序時應(yīng)該考慮的幾個情況:發(fā)送請求時,附加一個User-Agent頭,傳入MIDP和自身版本號,以便服務(wù)器能識別此請求來自MIDP應(yīng)用程序,并且根據(jù)版本號發(fā)送相應(yīng)的相應(yīng);連接服務(wù)器時,顯示一個下載進(jìn)度條使用戶能看到下載進(jìn)度,并能隨時中斷連接;由于無線網(wǎng)絡(luò)連接速度還很慢,因此有必要將某些數(shù)據(jù)緩存起來,可以存儲在內(nèi)存中,也可以放到RMS中;由于手機(jī)內(nèi)存有限,因此需要控制應(yīng)用程序的大小。
對于服務(wù)器端而言,其輸出響應(yīng)應(yīng)當(dāng)盡量做到: 明確設(shè)置Content-Length字段,以便MIDP應(yīng)用程序能讀取HTTP頭并判斷自身是否有能力處理此長度的數(shù)據(jù),如果不能,可以直接關(guān)閉連接而不必繼續(xù)讀取HTTP正文;盡量不要重定向URL,這樣會導(dǎo)致MIDP應(yīng)用程序再次連接服務(wù)器,增加了用戶的等待時間和網(wǎng)絡(luò)流量;如果發(fā)生異常,向MIDP發(fā)送錯誤頁面毫無意義,應(yīng)當(dāng)直接發(fā)送一個404或401錯誤,這樣MIDP應(yīng)用程序就可以直接讀取HTTP頭的響應(yīng)碼獲取錯誤信息而不必繼續(xù)讀取相應(yīng)內(nèi)容;由于服務(wù)器的計(jì)算能力遠(yuǎn)遠(yuǎn)超過手機(jī)客戶端,因此,針對不同客戶端版本發(fā)送不同的響應(yīng)的任務(wù)應(yīng)該在服務(wù)器端完成。
除了以上幾點(diǎn)外,在程序中還會添加很多的異常處理的代碼來保證程序的正確執(zhí)行,但是使用異常類并不是一個最佳的選擇。Sun開發(fā)的Wireless BluePrint用以保證程序開發(fā)人員能夠?qū)⒖蛻舳顺绦蚺c使用Enterprise Java Beans的后臺服務(wù)器快速的連接起來。按照J(rèn)2EE規(guī)范開發(fā)部署服務(wù)器是一個正確的方式,但是在連接無線網(wǎng)絡(luò)的時候也不能保證解決任何問題。隨著企業(yè)應(yīng)用系統(tǒng)提供的WEB服務(wù)日益廣泛和成熟,J2ME 應(yīng)用程序可以在 HTTP 協(xié)議上使用 XML[5] 數(shù)據(jù)格式與后臺服務(wù)器或其它 J2ME 應(yīng)用程序通信。XML提供了一些很重要的優(yōu)點(diǎn)。XML 是一種非常健壯的、易于理解的消息格式。這也是為新一代開放、可互操作的 Web 服務(wù)所選的通信數(shù)據(jù)格式。遺憾的是,所有那些額外標(biāo)記使 XML 對于有限的無線帶寬而言成為一種相當(dāng)龐大的格式,增加了實(shí)際的傳輸負(fù)擔(dān)。但是,當(dāng)發(fā)送緊湊的二進(jìn)制或字符串?dāng)?shù)據(jù)時,相對于XML可以達(dá)到較高的效率,用DataOutputStream直接寫入并設(shè)置Content-Type為application/octet-stream即可。
5 總結(jié)
本文主要介紹了J2ME網(wǎng)絡(luò)編程的相關(guān)基礎(chǔ)知識,指出了網(wǎng)絡(luò)編程其中存在的問題,并提出了解決的方法。隨著移動通信網(wǎng)絡(luò)的發(fā)展和支持J2ME的移動通信設(shè)備的普及,基于J2ME的網(wǎng)絡(luò)編程在今后的移動應(yīng)用中會有更加廣闊的前景。
參考文獻(xiàn):
[1] 李振鵬,龔劍.J2ME手機(jī)游戲開發(fā)技術(shù)詳解[M].北京:清華大學(xué)出版社,2006.
[2] 池瑞楠.基于J2ME和J2EE的移動電子商務(wù)系統(tǒng)研究[J].微計(jì)算機(jī)信息,2007,23(12):158-160.
[3] 盧軍.J2ME應(yīng)用程序開發(fā)[M].北京:中國鐵道出版社,2002.
[4] 張亮.GPRS技術(shù)在移動視頻監(jiān)控中的應(yīng)用[EB/OL].http://www.cps.com.cn/news/Html/Special/jian18/.
[5] 盧曼莎.基于Web服務(wù)的大型移動電子商務(wù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(18):3457-3459.