程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 開發適應中國網絡的J2ME連網程序(2)

開發適應中國網絡的J2ME連網程序(2)

編輯:J2ME

2 連接框架的用法


七種創建連接的方法,下面是代碼示例

public static Connection open(String name)
public static Connection open(String name)
public static Connection open(String name, int mode, boolean timeouts)
public static DataInputStream openDataInputStream(String name)
public static DataOutputStream openDataOutputStream(String name)
public static InputStream openInputStream(String name)
public static OutputStream openOutputStream(String name)

Connector 構建了7個靜態的方法,上面方法,具體的相關用法以及參數說明可以查看APIs文檔。
通訊連接的IO數據流過程基本步驟分別是建立連接、網絡通訊、連接關閉。
1、建立連接,創建與服務端的連接初始化以及完成連接過程。
2、數據通訊,在連接已建立的基礎上進行數據的交換以及完成通訊過程。
3、完成通訊之後即關閉網絡通訊連接,釋放資源。

使用小秘密:

在程序調用Connector.open()相關方法的時候,如果您的J2ME程序是沒有經過簽名的,系統會彈出一個是否允許的對話框,其實,我們在開發的過程中也可以調用下面的代碼進行一些權限的判斷,然後做出適當的動作。
MIDlet. checkPermission("Javax.microedition.io.Connector.file.read");
MIDlet. checkPermission("Javax.microedition.io.Connector.file.write");
MIDlet.checkPermission("Javax.microedition.io.Connector.http")
其他一些權限檢查請查看相關的APIs文檔。

簡單用法代碼片段

// Create a ContentConnection
String url = "http://www.coreJ2ME.com"
ContentConnection connection = (ContentConnection) Connector.open(url);
// With the connection, open a stream
InputStream iStrm = connection.openInputStream();
// ContentConnection includes a length method
int length = (int) connection.getLength();
if (length != -1)
{
byte imageData[] = new byte[length];
// Read the data into an array
iStrm.read(imageData);
}

3 .1 中國的網絡環境

運營商

代理名稱

用法介紹

直連名稱

用法

中國移動

CMWAP

CMWAP是中國移動的GPRS代理上網。

創建連接的時候,不能直接采用

Connector.open("target address");

而是采用代理的方式進行連接

具體相關的創建代碼是代理的方式。

代理地址是:10.0.0.172

代理Header是:X-Online-Host

CMNET

3家運營上的直連方式,創建連接跟PC無異。

中國聯通

UNIWAP

UNIWAP是中國聯通退出的一種上網模式。類似於中國移動。具體創建連接的方式跟中國移動類似。

代理地址是:10.0.0.172

代理Header是:X-Online-Host

在處理網關的時候可能會有一些細致的差別,比如在發送Header數據的時候。

UNINET

中國電信

CTWAP

CTWAP 是中國電信最近推出的上網方式。到目前為止我還沒有找到J2ME可以上ctwap的方式,網上只是提到了代理地址是10.0.0.200,header key是啥,該傳什麼值,暫時還不知道,如果有讀者知道的可以聯系我([email protected])

CTNET

3 .2 HttpConnection 介紹

我們先來講解下HttpConnection相關的方法。

現在您已經看到 GCF 是如何支持不同類型的連接的,並且開發了我們的第一個連網 MIDlet,現在可以更深入地分析 MIDP 中對 HTTP 的支持。我們將首先從一個更新過的層次結構圖開始,它表明了哪個類提供了對 HTTP 連接的支持。

圖:支持 HTTP 的 GCF 類

原來的 MIDP 1.0 規范只要求設備支持 HTTP 連接協議,而更新的 MIDP 2.0 規范要求同時支持 HTTP 和 HTTPS,後者提供了對更安全的網絡連接的支持。使用這些協議的 API 分別是 HttpConnection 和 HttpConnection 。除了這些強制性的協議,設備制造商可能會選擇支持更多的通信協議,如數據包或者套接字。雖然有時會方便一些,但是您應當了解使用特定於廠商的協議會影響應用程序到其他設備的可移植性。

請求和響應協議:HTTP 和 HTTPS 都是請求/響應協議。客戶機發送請求,而服務器發送響應。在繼續後面的內容之前,我們將分析客戶請求和服務器響應的各個方面。

客戶請求:客戶請求(clIEnt request),有時稱為請求實體,由以下三個部分組成:

· 請求方法

· 頭

· 正文

我們將詳細討論這三個部分。

請求方法:請求方法(request method)確定數據如何發送給遠程資源。可以使用的三種方法是 GET、 POST 和 HEADER 。使用 GET 時,數據是作為 URL 的一部分發送的。使用 POST 時,所有客戶機數據都是在與建立連接的請求不同的、單獨的流中發送的。 HEADER 請求不向服務器發送任何數據。相反, HEADER 請求只是描述(meta)關於遠程資源的信息。

用 GET 打開一個 HTTP 連接

String url = "http://www.ucweb.com?size=large";

HttpConnection http = null;

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

http.setRequestMethod(HttpConnection.GET);

setRequestProperty("User-Agent", "Openwave");

Openwave -- 是一個比較出名的Wap浏覽器廠商,因此設置這個UA,移動網關一般可以通過。

用 POST 打開一個 HTTP 連接

String url = "http://www.ucweb.com",

tmp = "test data here";

OutputStream ostrm = null;

HttpConnection http = null;

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

http.setRequestMethod(HttpConnection.POST);

// Send clIEnt body

ostrm = http.openOutputStream();

byte bytes[] = tmp.getBytes();

for(int i = 0; i < bytes.length; i++)

{

os.write(bytes[i]);

}

os.flush();

POST/GET 請求一般都是在網頁中的Form進行指定,如果你亂用這些請求可能會導致一些意外的效果,比如Form指定POST請求,則用GET請求就會出問題。

上面的請求過程只是完成一次HTTP請求中的客戶端請求,下面我們來看下服務器是怎麼響應的。

服務器響應:當服務器收到並處理了客戶請求後,它必須打包並發送響應。與客戶請求一樣,服務器響應有三個部分:

· 狀態行

· 頭

· 正文

狀態行:顧名思義, 服務器狀態行(server status line)通知客戶機其請求的結果。HTTP 將狀態行代碼分為以下三大類:

· 1xx是提供信息 。

· 2xx是成功 。

· 3xx是重定向 。

· 4xx是客戶機錯誤 。

· 5xx是服務器錯誤。

更加具體的響應代碼請查看HTTP相關協議文檔。

介紹一本書《Java Servlets 2.3 編程指南》此書狀態代碼有詳細的介紹。

服務器狀態行包括在服務器上運行的協議版本號、狀態碼和表示返回代碼的文字消息。下面是有效的狀態行的幾個例子:

· “HTTP/1.1 200 OK”

· “HTTP/1.1 400 Bad Request”

· “HTTP/1.1 500 Internal Server Error”

頭:與客戶機不同,服務器可以通過頭字段發送信息。

顯示了三種最常用的、提取來自服務器的頭信息的方法。

String getHeaderField(int n) Get header fIEld value looking up by index

String getHeaderField(String name) Get header fIEld value looking up by name

String getHeaderFieldKey(int n) Get header fIEld key using index

注意:雖然系統給你提供了這些方法,但建議你通信的時候別這麼做,因為有可能有些地方的移動網關會過濾掉你這些參數。至於該怎麼傳輸你想要的數據,那就看各位的私有的協議是咋通訊了。

在開發網絡軟件,很多時候是需要調試的,因此一款好的抓包工具對我們的工作幫助是很大的,在這裡我推薦使用iris http://www.eeye.com/html/Products/Iris/index.Html


HttpConnection API

方法

說明

long getDate()

得到頭字段日期

long getExpiration()

得到頭字段失效時間

String getFile()>

從 URL 得到文件名

int getHeaderFIEld(int n)

通過查詢索引得到頭字段值

String getHeaderFIEld(String name)

通過查詢名字得到頭字段值

long getHeaderFIEldDate(String name, long def)

得到作為 long 型的指定字段(表示日期)

int getHeaderFIEldInt(String name, int def)

得到作為整數的指定字段

String getHeaderFIEldKey(int n)

使用索引得到頭字段鍵

String getHost()

根據 URL 得到主機

long getLastModifIEd()

得到最後修改的字段值

String getPort()

從 URL 得到端口

String getProtocol()

從 URL 得到 協議

String getQuery()

得到查詢字符串(只對 GET 請求有效)

String getRef()

得到 URL 的引用部分

String getRequestMethod()

得到請求方法的當前設置( GET 、 POST 或者 HEAD )

String getRequestProperty(String key)

得到一種請求屬性的當前設置

int getResponseCode()

得到響應碼(數字值)

String getResponseMessage()

得到響應消息(文字值)

String getURL()

得到整個 URL

void setRequestMethod(String method)

設置請求方法( GET 、 POST 或者 HEAD )

void setRequestProperty(String key, String value)

設置請求屬性(頭信息)


注意點:我們在使用Http的過程中最常用的方法就是getResponseCode(); openInputStream()等操作。

HttpConnection的實現原理,並不是在open的時候去連網,而是你做getResponseCode();

openInputStream(); openOutputStream(); 等讀寫操作的時候才真正的去創建。因此只是調用open()是不會觸發連網動作的。

HttpConnnection在底層的實現上也是采用TCP Socket的方式進行數據的讀寫。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved