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

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

編輯:J2ME

3 .3 創建GPRS連接

在中國目前知道的可以連接成功的有中國移動,跟中國聯通,由於移動起步比較早,相對網關,以及基站方面的建設要好於聯通,而且基於移動方面的軟件也相對多而且成熟,因此聯通在建設GPRS方面就向移動靠攏,原則上來說,聯通是無縫兼容移動的,但是也不保證有細微的差別,讀者在開發網絡環境下的軟件的時候,最後經過兩個網絡的驗證才能保證產品的網絡質量。至於電信,由於電信剛接手移動通信,因此在網絡的建設,經驗方面相對差點,因此到目前為止,我還沒有找到一個辦法連接ctwap。這裡只介紹cmwap,uniwap連接的創建方式以及注意事項。


打開GPRS Http連接的代碼清單

HttpConnection sHttp = (HttpConnection) .Connector.open("http://10.0.0.172:80");

sHttp.setRequestProperty("X-Online-Host","wap.ucweb.com");

代碼就這麼簡單,不過這裡需要注意的Header的發送。


User-Agent -- 非常重要的參數,很多網站對這個字段很敏感,如果這個字段發送有誤,或者含糊不清,及有可能對方服務器會相應500,或者其他錯誤。

Connection -- 向對方服務器請求連接的模式,Close 請求一次就關閉,Keep-Alive 保持連接,原則上說來,keep-alive可以達到最優化的速度,但是也是需要客戶端跟服務器同時支持才行。建議采用close模式,這樣做就比較穩妥了。


還有其他一些參數,可以參考HTTP相關的協議說明。

歡迎進入Java社區論壇,與200萬技術人員互動交流 >>進入


3 .4 從網絡上獲取圖片

經過上面的基礎知識以及中國環境下相關的網絡介紹,這一單節,我們來點實戰的,我們的Demo將采用HttpConnection方式從網絡上獲取一張圖片,並顯示在手機的屏幕上

我們在這個Demo中將會講解其中的要點,具體相關的完整的源代碼請點擊這下載。

下面是相關的實現代碼,代碼裡有相當詳細的注釋。

import Javax.microedition.lcdui.*;
import Java.io.IOException;
import Javax.microedition.io.HttpConnection;
import Javax.microedition.io.Connection;
import Javax.microedition.io.Connector;
import Java.io.InputStream;
import Java.io.ByteArrayOutputStream;
/**
* <p>Title: p>
*
* <p>Description: p>
*
* <p>Copyright: Copyright (c) 2009p>
*
* <p>Company: p>
*
* @author not attributable
* @version 1.0
*/
public class ImageForm extends Form implements CommandListener {
Command iHttp = new Command("http", Command.BACK, Command.ITEM);
Command IExit = new Command("Exit", Command.EXIT, 1);
public ImageForm() {
super("ShowImage");
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
// Set up this Displayable to listen to command events
setCommandListener(this);
// add the Exit command
addCommand(IExit);
addCommand(iHttp);
}
public void commandAction(Command aCommand, Displayable aDisplayable) {
/** @todo Add command handling code */
if (aCommand == IExit) {
// stop the MIDlet
HttpDemo.quitApp();
}else if(aCommand == iHttp){
startRqeusetHttpImage();
}
}
/**
* startReqeustSocketImage
*/
private void startReqeustSocketImage() {

}
/**
* 執行請求
*
*/
private void startRqeusetHttpImage() {
//一般來說,操作網絡等有阻塞的動作最好是啟動一個線程。
new Thread() {
public void run() {
HttpConnection sHttp = null;
InputStream sIs = null;
try {
append("Strart Request");
append("");
sHttp = (HttpConnection) openConnection("/School/UploadFiles_7810/201202/20120215182946306.png", 0);
sHttp.setRequestMethod(HttpConnection.GET);//設置請求方法,如果不設置的話,則系統默認的請求就是GET請求
sHttp.setRequestProperty("User-Agent", "Openwave"); //設置UA參數
sHttp.setRequestProperty("connection", "close");

int sCode = sHttp.getResponseCode();
if(sCode == 200){
sIs = sHttp.openDataInputStream();
byte [] sImageData = readDataFromStream(sIs, 512);
if(sImageData != null)
append(Image.createImage(sImageData, 0 , sImageData.length));
}

}
catch (Exception ex1) {
append(ex1.toString());
}finally{
//一般來說,close數據,一般寫在finally方法,這樣可以保證到如果程序出現任何問題都可以關閉連接,防止連接洩漏
try {
sIs.close();
sHttp.close();
} catch (IOException ex) {
}
}
}
}.start();
}

/**
* 創建一個連接
* @param aUrl String
* @param aNetworType int 0--CMNET ; 1--CMWAP
* @return Connection
*/
final Connection openConnection(String aUrl, int aNetworType){
Connection sConnection = null;
try{
if (aNetworType == 0) {
sConnection = Connector.open(aUrl);
} else {
HttpConnection sHttp = (HttpConnection) Connector.
open("http://10.0.0.172:80");
sHttp.setRequestProperty("X-Online-Host",
aUrl);
sConnection = sHttp;
}
}catch(Exception e){
append("Open Error=>" + e.toString());
}
return sConnection;
}

/**
* 從輸入流中讀取數據
* @param aIs InputStream
* @param aCache int //設置緩存大小,這個參數比較重要,設置大了,速度不一定快,因此得測試根據經驗找個平衡點
* @return byte[]
*/
final byte[] readDataFromStream(InputStream aIs, int aCache){
byte[] sData = null;
Java.io.ByteArrayOutputStream bos = new ByteArrayOutputStream();
try{
byte[] sCaceh = new byte[aCache];
int pos = 0;
int hasRead = 0;
while ((pos = aIs.read(sCaceh, 0, aCache)) != -1) {
hasRead += pos;
bos.write(sCaceh, 0, pos);
}
sData = bos.toByteArray();
}catch(Exception e){

}
return sData ;
}
}

圖:運行截圖

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