摘要:隨著移動通信技術的發展,從移動設備上訪問網絡變得越來越重要。Sun公司針對嵌入式和移動設備推出的J2ME提供了開發和運行應用程序的平臺,但由于運行J2ME程序的設備是資源有限的,因此了解J2ME的網絡編程對開發人員來說是非常必須的。
關鍵詞:J2ME;CLDC;MIDP;HTTP
中圖分類號:TP312文獻標識碼: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公司針對各種小型消費電子產品推出的Java開發平臺,是一種高度優化的Java運行環境,主要針對消費類電子設備的,例如蜂窩電話、可視特性移電話、數字機頂盒和汽車導航系統等等。Java語言的與平臺無關的植到小型電子設備上,允許移動無線設備之間共享應用程序。J2ME的出現使開發跨平臺的消費類電子產品的應用軟件成為可能。
隨著Internet網絡技術的迅速發展,基于互聯網的無線應用范圍不斷擴展,網絡已從有線連接朝著無線和移動方向發展。在將來的無線通信時代中,大量的網絡應用程序將被開發出來以滿足無線移動通訊的要求,而要充分的發揮無線移動通訊設備的通信能力,J2ME網絡編程就變得尤為重要。
2 J2ME的體系結構
隨著Java技術的不斷發展,針對不同領域的需求,Java自身被分成三個版本:J2EE (企業版)、J2SE (標準版)、J2ME ( 微型版,嵌入式設備及消費類電子產品級應用)。前兩個版本分別是針對企業開發和桌面開發而設計。J2ME定位在消費類電子產品的應用上,這個版本針對資源有限的電子消費產品的需求精簡核心類庫,并提供了模塊化的架構,以便讓不同類型產品能夠隨時增加支持的能力。
在 J2ME 規范中, J2ME 的體系結構劃分為兩個大模塊, 即配置(Configuration) 和描述(Profile)。配置是用于一組通用設備的最小的 Java 平臺, 而描述則為具體的系列設備或特別的應用程序提供更具體的能力。J2ME使用配置和描述針對不同類型的設備定制Java運行時環境(JRE)。作為一個完整的JRE, J2ME由配置和簡表組成,配置決定了運行環境所使用的Java虛擬機(JVM),而簡表通過添加特定于域的類來定義應用程序。到目前為止,J2ME規范定義的配置只有兩種:一種是Connected Limited Device Configuration ( CLDC,連接有限設備配置),致力于低端的消費類設備,特點是512 KB 以下內存、有限能源供應(通常使用電池)、有限或非持續網絡連接、簡單的用戶界面、16位或者32位的處理器,比如手機、PDA、雙向尋呼機等;另一種是Connected Device Configuration ( CDC,連接設備配置),致力于高端消費類設備,特點是2M以上內存、具有網絡連接能力,通常為無線網絡 、需要實現java虛擬機規范的全部功能、32位或者64位的處理器,比如機頂盒、汽車導航系統等。J2ME 的描述層[2] (Profile) 是定義在配置層之上, 它主要提供配置層中所缺少的功能以支持特定的設備。這些功能包括對 UI 和對持續性存儲的支持等, 它比配置層的針對性更強。其中,MID Profile(移動信息設備描述 Mobile Information Device Profile, 簡稱 MIDP)是目前 J2ME 平臺中發展相對最成熟的 Profile。與配置的縱向特性不同的是,簡表是橫向的。圖1是J2ME體系結構的框圖。
3 J2ME的網絡編程
回顧手機的發展歷史,手機上應用軟件的發展也經歷了3個階段[3]。傳統的手機通常只有通話和短消息功能,只能提供基本的語音服務。隨后手機上又增加了一些簡單的附加應用,如電話簿和電話鈴聲編輯功能等。隨著WAP技術的發展,手機增加了訪問Internet的功能,使用戶可以直接在手機上以無線方式瀏覽網頁。WAP包括兩層內容:一層是傳輸層,針對無線的特點制定了WDP和WTP等協議;另一層是應用層,也就是WAP Browser,WAP為了適應低速網絡的限制,簡化了Internet標準的HTML,制定了WML標準。然而,隨著無線Internet新應用的出現,新的問題也隨之而來。
手機訪問Internet通過WAP方式,而WAP采用Browser/Server方式訪問Internet卻功能有限。因為現在的WAP解決方案要求手機通過WAP網關才能訪問Internet,而且只能訪問WML而不是主流的HTML,也不能顯示復雜格式的圖形。此外,因為現有的WAP解決方案不夠智能,而且不能訪問本地存儲區,如果進行在線交易會增加服務器負荷,反應速度慢,使無線Internet應用受到了很大的限制。
J2ME的出現則使上述問題迎刃而解。J2ME的MIDP在javax.microedition.io程序包中提供了一整套類,統稱為通用連接構架(Generic Connection Framework ,GCF),該架構用于定義一種設備必須支持何種通信協議。MIDP規范只要求支持一種網絡協議,即HTTP1.1協議的子集,而HTTP協議正是一種用于在客戶端和服務器端交換任意形式數據的非常靈活的協議。J2ME在傳輸層實現了HTTP協議,實際的傳輸可以基于WAP實現,也可以基于其他方式(如CSD、GPRS等);在應用層提供了全功能的Java開發環境,使手機能以Client/Server方式直接訪問Internet的信息,從而使得不同的Client訪問不同的資源。J2ME 是一種專用于智能應用程序的開發平臺,J2ME 應用程序比基于WAP構建的應用程序提供了更多的功能,最主要的優點是J2ME應用程序能夠在本地存儲和處理數據,因此減少了網絡流量,節省了寶貴的無線帶寬和減少了延遲時間。Java 2標準版( J2SE)在java.io和java.net程序包中定義了100多個接口程序,類和異常。通過這些庫所實現的功能是很強大的,J2ME定義了這些函數的子集,并提供了一套用于網絡和文件訪問的固定的程序包javax.microedition.io程序包。下面給出了一個使用HTTP協議的客戶端和服務器端的代碼:
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;}
}
//客戶端發送請求
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) 服務器端
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();
//根據傳過來的數據,調用相應的方法
response.setContentLength(result.size());
}
在這個例子中,當J2ME客戶端使用HTTP協議向服務器發送數據時,采用的是POST方式。這個方式可以傳遞任意格式的數據(包括二進制),并且傳送的數據沒有大小限制。設置好數據傳輸方式后,接下來應該設置正確的HTTP頭。當客戶端向服務器發送數據時,采用的格式是一個重要的問題。只有數據采用了客戶端和服務器都能理解的格式,數據才能被正確發送。使用XML作為數據格式是一個比較好的,但是比較復雜。除了XML外,一個比較好的選擇就是使用DataOutputStream和DataInputStream類的編碼和解碼功能來進行數據傳遞。
在服務器端同樣有接收和發送數據的問題。服務器可以使用Jsp或Pearl來實現接收和發送數據,但為了保持便捷性和一致性,上例使用了servlet。服務器接收數據時可以用InputStream來讀取數據。當發送數據時,首先應向客戶端發送數據的MIME類型,接下來發送實際的數據了。在仿真器中,程序可以通過Internet快速的連接服務器。但由于手機是資源有限設備,基于以上分析,在手機運行程序時可能會出現無法連接無線網絡的情況。由于HTTP是一個基于文本的效率較低的協議,因此,必須仔細考慮手機和服務器端的通信內容,盡可能地提高效率。
4 J2ME網絡編程存在的問題及解決方案
在MIDP上開發出來的應用程序被稱為MIDlet,這些 MIDlet可以通過擴 CLDC/MIDP 的包獲得支持,運行在手機、PDA等資源有限設備上,因此MIDlet所運行的硬件環境和網絡環境都無法與桌面系統相比。當在手機上運行MIDlet程序時受到許多限制,主要問題包括:存儲空間小,由于異常處理代碼的不斷增加,消息的持久存儲,J2ME應用程序也相應的越來越膨脹,以致于手機上可以存儲程序所需內存相對較小,不能將大部分文件放在客戶端而只能放在服務器上,使用時下載到設備上;內存及處理器性能受限,只能將大部分復雜的運算分配給服務器處理,設備只需要接受返回結果;通過無線網絡傳輸客戶端請求和服務器端響應的數據比通過有線網絡傳輸要慢得很多;在目前的條件,手機和無線網絡經常會斷開也是很“正?!钡那闆r;由于無線網絡的帶寬起伏較大,會使得使用request/response方式傳輸數據的應用程序經常會中斷響應。
當然,我們可以通過優化代碼讓MIDlet應用程序的體系結構變得簡捷,通過修正程序的功能實現來去掉多余的代碼,為更好的實現傳送數據的功能而在服務質量上做出讓步,使得應用程序更好的運行在設備上。但是一個需要考慮的主要問題,無線網絡是不可靠的,在這樣的環境下運行應用程序應該有一個優化的無線通信模塊。因為相對于可靠并且快速的Internet,GPRS的傳輸速率[4]只有56Kbps至114Kbps,即使TDMA幀的8個時隙都用來傳送數據,那么數據速率也只達到164Kbps。
為盡可能提高效率,以下是在設計J2ME程序時應該考慮的幾個情況:發送請求時,附加一個User-Agent頭,傳入MIDP和自身版本號,以便服務器能識別此請求來自MIDP應用程序,并且根據版本號發送相應的相應;連接服務器時,顯示一個下載進度條使用戶能看到下載進度,并能隨時中斷連接;由于無線網絡連接速度還很慢,因此有必要將某些數據緩存起來,可以存儲在內存中,也可以放到RMS中;由于手機內存有限,因此需要控制應用程序的大小。
對于服務器端而言,其輸出響應應當盡量做到: 明確設置Content-Length字段,以便MIDP應用程序能讀取HTTP頭并判斷自身是否有能力處理此長度的數據,如果不能,可以直接關閉連接而不必繼續讀取HTTP正文;盡量不要重定向URL,這樣會導致MIDP應用程序再次連接服務器,增加了用戶的等待時間和網絡流量;如果發生異常,向MIDP發送錯誤頁面毫無意義,應當直接發送一個404或401錯誤,這樣MIDP應用程序就可以直接讀取HTTP頭的響應碼獲取錯誤信息而不必繼續讀取相應內容;由于服務器的計算能力遠遠超過手機客戶端,因此,針對不同客戶端版本發送不同的響應的任務應該在服務器端完成。
除了以上幾點外,在程序中還會添加很多的異常處理的代碼來保證程序的正確執行,但是使用異常類并不是一個最佳的選擇。Sun開發的Wireless BluePrint用以保證程序開發人員能夠將客戶端程序與使用Enterprise Java Beans的后臺服務器快速的連接起來。按照J2EE規范開發部署服務器是一個正確的方式,但是在連接無線網絡的時候也不能保證解決任何問題。隨著企業應用系統提供的WEB服務日益廣泛和成熟,J2ME 應用程序可以在 HTTP 協議上使用 XML[5] 數據格式與后臺服務器或其它 J2ME 應用程序通信。XML提供了一些很重要的優點。XML 是一種非常健壯的、易于理解的消息格式。這也是為新一代開放、可互操作的 Web 服務所選的通信數據格式。遺憾的是,所有那些額外標記使 XML 對于有限的無線帶寬而言成為一種相當龐大的格式,增加了實際的傳輸負擔。但是,當發送緊湊的二進制或字符串數據時,相對于XML可以達到較高的效率,用DataOutputStream直接寫入并設置Content-Type為application/octet-stream即可。
5 總結
本文主要介紹了J2ME網絡編程的相關基礎知識,指出了網絡編程其中存在的問題,并提出了解決的方法。隨著移動通信網絡的發展和支持J2ME的移動通信設備的普及,基于J2ME的網絡編程在今后的移動應用中會有更加廣闊的前景。
參考文獻:
[1] 李振鵬,龔劍.J2ME手機游戲開發技術詳解[M].北京:清華大學出版社,2006.
[2] 池瑞楠.基于J2ME和J2EE的移動電子商務系統研究[J].微計算機信息,2007,23(12):158-160.
[3] 盧軍.J2ME應用程序開發[M].北京:中國鐵道出版社,2002.
[4] 張亮.GPRS技術在移動視頻監控中的應用[EB/OL].http://www.cps.com.cn/news/Html/Special/jian18/.
[5] 盧曼莎.基于Web服務的大型移動電子商務系統的設計與實現[J].計算機工程與設計,2006,27(18):3457-3459.