首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 網路開發實踐:HTTP 通訊最佳化與實作模式

     編輯:J2ME

協定選擇與限制

無線裝置支援的網路協定有限(HTTP、Socket、UDP),MIDP 1.0 強制實作 HTTP,其他為可選。為確保跨裝置移植性,首選 HTTP 協定,並可重用伺服器端 Web 程式碼。雖然 HTTP 為文字基礎、效率較低,但透過精心設計通訊內容、善用快取,仍可達到不錯速度。

MIDlet 端最佳實務

  1. 附加 User-Agent 標頭:傳送 MIDP 版本與應用程式版本,讓伺服器識別客戶端並回應相容資料。
  2. 顯示下載進度條:讓使用者掌握進度,並可隨時中斷連線。
  3. 資料快取:利用記憶體或 RMS 儲存常用資料,減少重複下載。

伺服器端回應最佳化

  1. 明確設定 Content-Length:客戶端可先判斷資料大小,決定是否處理。
  2. 避免傳送 HTML/XML:解析成本高,改傳緊湊二進位資料(application/octet-stream),配合 DataOutputStream 讀寫。
  3. 減少重導向:避免額外連線與流量。
  4. 錯誤直接回傳 HTTP 狀態碼(如 404、401),而非錯誤頁面,客戶端即可從標頭取得錯誤資訊。
  5. 版本適配在伺服器端完成:依 User-Agent 判斷客戶端版本,回應相容資料,舊版客戶端無需升級即可繼續使用。

HTTP 連線架構設計

採用 HttpThread 背景執行緒處理連線,搭配 HttpListener 介面實作觀察者模式,通知 UI 進度、完成、錯誤事件。

HttpListener 介面

public interface HttpListener {
    void onSetSize(int size);
    void onFinish(byte[] data, int size);
    void onProgress(int percent);
    void onError(int code, String message);
}

HttpWaitUI 等待畫面

繼承 Form,實作 HttpListener,顯示 Gauge 進度條與取消指令。

HttpThread 核心邏輯 (GET 請求)

public void run() {
    HttpConnection hc = null;
    InputStream input = null;
    try {
        hc = (HttpConnection) Connector.open(url);
        hc.setRequestMethod(HttpConnection.GET);
        hc.setRequestProperty("User-Agent", USER_AGENT);

        int code = hc.getResponseCode();
        if (code != HttpConnection.HTTP_OK) {
            listener.onError(code, hc.getResponseMessage());
            return;
        }

        int size = (int) hc.getLength();
        listener.onSetSize(size);

        input = hc.openInputStream();
        byte[] buffer = (size != -1) ? new byte[size] : new byte[MAX_LENGTH];
        int index = 0, reads, percent = 0, tmp_percent = 0;

        while (!cancel) {
            int len = Math.min(128, buffer.length - index);
            reads = input.read(buffer, index, len);
            if (reads <= 0) break;
            index += reads;

            if (size > 0) {
                tmp_percent = index * 100 / size;
                if (tmp_percent != percent) {
                    percent = tmp_percent;
                    listener.onProgress(percent);
                }
            }
        }

        if (!cancel) {
            if (size != -1 && index != size)
                listener.onError(102, "Content-Length does not match.");
            else
                listener.onFinish(buffer, index);
        }
    } catch (IOException ioe) {
        listener.onError(101, "IOException: " + ioe.getMessage());
    } finally {
        // 關閉資源
    }
}

資料傳遞機制

定義 DataHandler 介面,下一個畫面實作 setData(DataInputStream) 讀取資料。HttpWaitUI 在 onFinish 中將位元組陣列轉為 DataInputStream 傳遞給目標畫面並切換顯示。

POST 請求與檔案上傳

POST 表單資料

  • 設定 Content-Type: application/x-www-form-urlencoded
  • 計算 Content-Length
  • 透過 OutputStream 寫入 URL 編碼資料
  • 需自行實作 URL 編碼(MIDP 無 URLEncoder)

Multipart 檔案上傳

  • 設定 Content-Type: multipart/form-data; boundary=XXX
  • 以 --boundary 分隔欄位,最後以 --boundary-- 結束
  • 每行以 \r\n 結束

Cookie 與 Session 維持

從回應標頭 Set-Cookie 擷取 Session ID(如 JSESSIONID),後續請求在標頭附加 Cookie: JSESSIONID=xxx。不建議使用 URL Rewriting,因 MIDP 難以解析。

結語

採用觀察者模式分離網路邏輯與 UI,配合二進位協定、快取與進度控制,可建立高效、可移植的 J2ME 網路應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved