使用J2me網絡編程訪問網頁內容--轉載哦~~
一、請求與響應的格式
我們非常需要關注請求與響應格式的一至性,比如:客戶端使用:
HttpConnection c = (HttpConnection)Connector.open
(urlStr
);
c.setRequestProperty("Content-Type", "application/xhtml+xml
")
表明自己識別的是:
application/xhtml+xml
類型的格式,服務器在傳輸時請按照相應格式給我組織響應的
byte[]
流;
那麼服務器最好按照客戶端要求的格式來響應;
這叫配套,如果請求和響應不配套就會出現很多怪問題,比如丟字,亂碼等;
至於配套的格式都有多少種,在網絡上可以查到,我就不一一列舉了,下面是一個關於
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.