通用聯網框架在J2ME平台中扮演著十分重要的角色,如果沒有它,我們寫的應用程序對外人來說只能說“神秘”,而應用了通用聯網框架進行聯網的程序就顯得“神奇”了。本文將對通用聯網框架進行整體的分析,具體的應用會在後續的文章詳細講述。
Generic Connection Framework(以下簡稱GCF)是在CLDC中定義的,由於移動信息設備的資源受限特性,所以Java.Net和Java.io包不適合在這裡使用。現實世界中使用著各種各樣的網絡通信協議,這使得設計好這個框架非常不容易,至少我是這麼認為的。然而當我們分析GCF的時候可以清楚地發現它有如下幾個特性:基於接口設計,便於擴展、提供創建連接的工廠方法、使用標准URL簡化了程序員的工作。
當我們察看CLDC1.1的api的時候我們可以發現其中定義了8個接口、一個Connector類和一個ConnectionNotFoundException異常。在MIDP2.0中進行了擴展,提供了HttpConnection、HttpsConnection接口,這樣使得MIDlet具備了通過Http或者Https協議與server通信的能力,提供了SocketConnection、ServerSocketConnection、UDPDatagramConnection接口,使得MIDlet能夠在TCP/IP層通過socket進行通信或者使用數據報進行通信的能力。至於CommConnection以及PUSH技術在這裡不講述。
結合GCF的接口層次圖來了解通用聯網框架是最好的辦法,下面我們看看它的層次結構。
<
最上層的接口是Connection,其他的接口都從他那裡繼承。在Connection中只定義了一個方法close()。在我們的現實世界中通常使用的是分組數據交換和電路交換,因此在聯網框架中相應的定義了DatagramConnection和StreamConnection。由於在基於流傳輸中我們需要對輸入流和輸出流通是具有操作的能力,因此StreamConnection擴展了InputConnection和OutputConneciton,我們經常使用的Conn.openInputStream(),conn.openOutputStream()方法都是在這兩個重要的接口中定義的。StreamConnectionNotifier接口定義了連接監聽器應該具備的能力,它的方法acceptAndOpen()方法返回一個StreamConnection類型的連接,ServerSocketConnection繼承了StreamConnectionNotifIEr接口,這樣如果你做socket server的時候就可以通過使用這樣的URL,socket://:port在你的設備上建立監聽端口等待連接。SocketConnection繼承了StreamConnection正好可以和ServerSocketConnection交相輝映。UDPDatagramConnection則是為了在分組數據交換中使用,他繼承了DatagramConnection接口。ContentConnection接口中只定義了三個方法getEncoding(),getLength()和getType(),我們非常熟悉的HttpConnection就是他的子類,在HttpConnection中定義了大量的操作,Http聯網功能也是MIDP規范中要求廠商必須支持的連接方式。現在你應該對層次比較清楚了吧,繼續往下看如何使用GCF。
GCF的是使用非常簡單,主要集中在Connector的open()方法上。我們要做的就是提供一個標准的URL參數傳遞給open方法,例如為了得到一個HttpConnection我們應該寫類似下面的代碼,
String url = “http://myip:myport/myservlet”;
HttpConnection httpConn = (HttpConnection)Connector.open(url);
我們應該清楚這個URL的格式如何定義的,有興趣的話你可以參考RFC2396,我這裡只列入他的基本格式:{scheme}:[{target}][{parms}] ,針對不同的網絡通信方式,你要做的就是寫出不同的URL,並通過強制轉換得到你需要的連接類型。這篇文章不提供如何進行數據傳輸的操作,你可以參考MIDP API文檔中HttpConnection接口中的詳細說明,也可以參考下面這篇文章http://blog.csdn.Net/mingJava/archive/2004/07/07/36528.ASPx
在數據傳輸結束後不要忘記關閉連接,這時候你就應該使用Connection中定義的close()方法了。
try { // Here close any open streams conn.close(); } catch (IOException ioe) { // Handle the exception. // Throw the exception, ignore it, or return an error. }
至此,關於GCF的整體介紹就結束了。我們應該清楚GCF的接口層次關系、掌握如何使用GCF。同時不要忘記把這個框架的設計銘記於心,事實上我覺得CLDC和MIDP中很多設計都值得我們去多多的思考。