使用J2me網絡編程訪問網頁內容--轉載哦~~

 
一、請求與響應的格式
我們非常需要關注請求與響應格式的一至性,比如:客戶端使用:
HttpConnection c = (HttpConnection)Connector.open (urlStr );
c.setRequestProperty("Content-Type", "application/xhtml+xml ")
表明自己識別的是: application/xhtml+xml 類型的格式,服務器在傳輸時請按照相應格式給我組織響應的 byte[] 流;
那麼服務器最好按照客戶端要求的格式來響應;
這叫配套,如果請求和響應不配套就會出現很多怪問題,比如丟字,亂碼等;
至於配套的格式都有多少種,在網絡上可以查到,我就不一一列舉了,下面是一個關於 Content-Type 說明的地址:
http://cocp.blogdriver.com/cocp/1221254.html
這個地址不知道會開放多久,如果訪問不到,就在 Google 上查 ”Content-Type” 即可
 
二、使用網關代理
如果我們只能通過中國移動的 cmwap 接入點訪問網站頁面( cmwap 接入點也是移動夢網的網關)或者我們要訪問位於移動夢網內的頁面,那麼我們就必須指定用於訪問這些頁面的代碼網關: 10.0.0 .172:80
下面的例子表明瞭如何使用中國移動的代理網關;
例一:通過 URL 拆分的方法使用代理網關
Boolean UseAgent=true;
if (!UseAgent) {
c = (HttpConnection) Connector.open("http://" + “www.sina.com” + “ /webui/index.html ”, Connector.READ_WRITE, true);
} else {
c = (HttpConnection) Connector.open("http://10.0.0.172:80/"
+ “ /webui/index.html ”, Connector.READ, true);
c.setRequestProperty("X-Online-Host", “www.sina.com”);
}
之所以這樣來寫 url ,是爲了方便大家看清楚在使用代理網關時如何進行 url 的拆分;
 
例二:不拆分 URL ,直接使用代理網關
Boolean UseAgent=true;
if (!UseAgent) {
c=(HttpConnection)Connector.open ( urlStr );
} else {
    c=(HttpConnection)Connector.open ("http://10.0.0.172:80/"+ urlStr );
    c.setRequestProperty("X-Online-Host", urlStr );
    c.setRequestProperty("Accept","*/*");
}
那兩種方式有何區別?
例一的方式是標準的寫法,但是用這種方法訪問移動夢網內的網頁會有問題:無法得到正確的網頁;這時候就要用第二種方法了。第一種方法能做的事情,第二種方法似乎都能做到,至少我還沒有遇見過反例。
至於這是爲什麼?我也不知道,知道的大仙如果感興趣請回貼說明一下吧,小神在此先謝過。
關於 cmnet cmwap ,讀者可以在 google 上查 活猴工作室 ,這哥們是 CTO ,他的 blog 上有一些非常不錯的文章;
三、讀取服務器響應的內容:
我們通常用以下幾種方式讀取服務器端響應的內容:
例一:按指定編碼逐字符讀取
int ch=0;
StringBuffer sb = new StringBuffer ();
InputStreamReader isr = new InputStreamReader (dis,"utf-8");
try {
while ((ch=isr.read())!=-1){
        System.out.print((char)ch);
        sb.append((char)ch);
    }
}catch (Exception ex){
    sb.append("/r/n");
    sb.append(ex.toString());
}
isr.close();
這種方法的優點是:它是在讀取文本內容時最方便的一種作法,不過這種作法有一個缺陷,如果服務器端使用 asp.net ,用 Response.write(“”) 的方法向客戶端返回的話, isr.read() 永遠讀不到 -1 .net java 在數值的字節流轉換上劃的不是一套拳。這時候就只能依靠使用最外層的那個 try {} catch() 來捕獲錯誤的方法來終止讀取,因此,這種方法看起來似乎總有點傻乎乎的感覺;
例二:先原樣讀取字節流,然後再對字節流進行轉碼;
ByteArrayOutputStream baout = new ByteArrayOutputStream(1024);
byte [] bytes = new byte [128];
int size = 0;
int TotalSize = 0;
requestByte = null ;
while ((size = is.read(bytes)) != -1) {
    baout.write(bytes, 0, size);
    TotalSize += size;
}
bytes = null ;
responseByte = baout.toByteArray();
String responseStr = new String(responseByte,"UTF-8");
注: responseStr 即爲所求;
這種方法忠實的讀取出所有返回到客戶端的字節流,並將這些字節流記錄下來;
不過,要想這種方法讀取到正確的字節流,我們需要留意在第一節中所提到的內容: 請求與響應的格式
這種方法的好處是以不變應萬變,萬變不離其宗,管它服務器發來什麼,不過都是一大堆的 byte[] 流而已,就像黑客帝國中的尼奧,他看破了這層 byte[] 流,想幹嘛就幹嘛。
四、編碼
常用的漢字編碼有: GB2313(GB2313-80) GBK UTF8 BIG5 碼, BIG5 編碼在港臺用;
常用的其它編碼有: ASC-II ISO-8859-1 Unicode
爲了獲得網頁的內容,當然要指定正確的編碼了,不同的網頁使用的編碼會不同,所以使用相同的程序在訪問不同的網頁時會表現不同,這時千萬別 大驚失色 ,其實只是小問題;
說到這裏,我要說個很苦惱的事情:我在 google 上很難查到各種國家標準,可能是這些鏈接很少被人關注到,一直希望能找到這樣一個網站,上面有各種國家發佈的標準、法律文件等可以被廣大人民羣衆方便的查詢到。不但齊全完整,而且還能與時具進,不知哪位大仙能告訴我幾個這種網站的網址?小神在此先謝過!
下面這個網站是中國國家教育部網站下面收藏的 GB2312-80 字符集;用 google 翻出來的,如果想從教育部網站首頁上找到它反而有點難度。另外,這個頁面不知道能存放在那裏多久。
 
 
關於作者:
布老虎, QQ 67090182
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章