CMNET就是一般的互聯網的網絡接入點。我們一般在SUN那裡看到的J2ME實例代碼都是基於CMNET接入點的網絡下載。一般來說,CMNET可以連接所有的網絡站點。下面就是我在開發仙劍的CMNET的下載資源包的代碼片斷。
/***************************************************************************
* 下載網絡文件
* @param url String 要下載的文件的地址URL
* @return byte[] 如果下載成功,返回文件的字節緩沖;
* 如果下載失敗,返回null
*/
public byte[] download_CMNET(String url) {
ContentConnection c;
InputStream is = null;
byte[] data = null;
try {
c= (ContentConnection)Connector.open("http://"+ServerName+"/"+url,Connector.READ,true);
is = c.openInputStream();
int dataLength = (int) c.getLength();
if (dataLength == -1) {
ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
int ch;
while ( (ch = is.read()) != -1)
bStrm.write(ch);
data = bStrm.toByteArray();
bStrm.close();
}
else {
data = new byte[dataLength];
Data_Read_Buf(is,data,0,dataLength);
}
is.close();
c.close();
}catch (Exception e) {
data = null;
}
c= null;
return data;
}
代碼很普通,不過需要注意的有以下兩點。
1. getLength()並不是一定都有效,比如我發現在Nokia 40的手機上這個函數有效,但是在Nokia 60的手機上,這個函數通常都無效。所以我們通常都必須要有另外一個下載方式,既是從while循環不斷從輸入流中一個一個讀byte,如果讀出為-1,則表示輸入流數據讀完。
2. Connector.open最後一個參數是表示是否允許timeout,通常我們都得設置true,因為GPRS網路經常中斷,那麼必須有個timeout來退出連接。依照我的經驗,一般如果能夠執行完c.openInputStream()後,就表明連接上了,只要連接上後,數據的下載是比較快的(也就是說網絡連接是最慢的)。
MOTO的手機通常都是默認接入點就是CMWAP。在手機上的“網頁“->”網頁設定”中可以設置默認的接入點。一般中國大陸的出產的MOTO手機都是設置的”移動夢網”的網絡接入點,起始就是CMWAP接入點。而MOTO最可惡的一點就是一旦默認接入點是CMWAP,那麼所有的J2ME應用程序都無法訪問CMNET。而Nokia 40雖然默認的接入點是CMWAP,但是運行中可以自動檢查CMNET來訪問CMNET。
解決MOTO的網絡連接有兩個辦法:
1. 在”網頁“->”網頁設定”中新建一個網頁,然後不需要填寫任何參數,設置成默認後,它就可以讓手機上J2ME程序通過CMNET訪問網絡了。
2. 通過移動的代理來實現通過CMWAP訪問互聯網。下面是仙劍中使用CMWAP下載資源包的代碼片斷:
/***************************************************************************
* 下載網絡文件
* @param url String 要下載的文件的地址URL
* @return byte[] 如果下載成功,返回文件的字節緩沖;
* 如果下載失敗,返回null
*/
public byte[] download_CMWAP(String url) {
HttpConnection c;
InputStream is = null;
byte[] data = null;
try {
c= (HttpConnection)Connector.open("http://10.0.0.172:80/"+url,Connector.READ,true);
c.setRequestProperty("X-Online-Host",ServerName);
c.setRequestProperty("Accept", "*/*");
is = c.openInputStream();
int dataLength = (int) c.getLength();
if (dataLength == -1) {
ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
int ch;
while ( (ch = is.read()) != -1)
bStrm.write(ch);
data = bStrm.toByteArray();
bStrm.close();
}
else {
data = new byte[dataLength];
Data_Read_Buf(is,data,0,dataLength);
}
is.close();
c.close();
}catch (Exception e) {
data = null;
}
c= null;
return data;
}
比如我們要下載
http://xxx.xxx.xxx.xxx/BB/AA.dat,那麼上面的ServerName= ”xxx.xxx.xxx.xxx”, 而url = ”BB/AA.dat”