3 .5 讀取wml數據
經過上面的代碼示例,我們知道怎麼樣獲取到一張圖片了,此節我將給大家講解下怎麼樣去奪取網站的wml數據。廢話少說,我們只需要在上面的基礎上加多一個方法就可以了。
下面是代碼示例
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: < SPAN>p>
*
* <p>Description: < SPAN>p>
*
* <p>Copyright: Copyright (c) 2009< SPAN>p>
*
* <p>Company: < SPAN>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/20120215183042180.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 ;
}
}
圖:運行截圖
3 .6 總結
經過上面的代碼實戰以後,相信讀者在對網絡編程方面也有了基礎的認識,至於一些深入性的問題,只能等待讀者們在實戰的時候去做一些相關的研究了,這裡不能面面俱到。
4 注意事項
1. 中國移動環境下的網絡編程
2. 請求參數的發送。特別是UA,Conneciton等參數
3. Cache 的大小。主要是保證網絡讀取速度的最優化
4. 手機各個平台對應的APIs的適配。主要是程序的兼容性考慮
5. 虛擬機平台相關的網絡底層實現,有些虛擬機不支持同時並發多個網絡線程。程序的兼容性考慮
5 參考資料
《Java Servlets 2.3 編程指南》
下載 J2ME Wireless Toolkit version 2.0。 http://Java.sun.com/products/sjwtoolkit/index.Html
可以在 Sun Microsystems 的 CLDC 和 MIDP 無線論壇 http://forum.Java.sun.com/wireless/forum.JSP?forum=76 上提問題並搜索 J2ME 相關的信息。
ITPUT的移動開發技術 頻道 http://publish.itpub.Net/lists/7826/0/7826.sHtml
Nokia 開發者論壇。
詹健飛的 《J2ME開發精解》,《Java ME核心技術與最佳實踐》。