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

J2ME 通用聯網框架 (GCF) 開發行動網路應用實戰指南

     編輯:Java 相關知識

MIDP 聯網基礎知識

  • 強制支援:HTTP/HTTPS 協定(所有 MIDP 裝置必須實作)
  • 選配支援:Socket、Datagram、SSL、Comm 等(視裝置廠商而定)
  • 核心類別:javax.microedition.io.Connector — 唯一入口點,open() 回傳 Connection 介面

HTTP POST 完整範例(官方 API 改良版)

void postViaHttpConnection(String url) throws IOException {
    HttpConnection conn = null;
    InputStream is = null;
    OutputStream os = null;
    try {
        // 1. 建立連線
        conn = (HttpConnection) Connector.open(url);
        
        // 2. 設定請求屬性
        conn.setRequestMethod(HttpConnection.POST);
        conn.setRequestProperty("User-Agent", "Profile/MIDP-2.0 Configuration/CLDC-1.1");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Language", "en-US");
        
        // 3. 發送資料
        os = conn.openOutputStream();
        String postData = "action=list&category=games";
        os.write(postData.getBytes("UTF-8"));
        os.flush();
        
        // 4. 檢查回應碼
        int rc = conn.getResponseCode();  // 此處才真正建立連線發送請求
        if (rc != HttpConnection.HTTP_OK) {
            throw new IOException("HTTP Error: " + rc);
        }
        
        // 5. 處理回應
        String contentType = conn.getType();
        processContentType(contentType);
        
        long len = conn.getLength();
        is = conn.openInputStream();
        if (len > 0) {
            byte[] data = new byte[(int) len];
            int read = 0, total = 0;
            while (total < len && (read = is.read(data, total, (int) len - total)) != -1) {
                total += read;
            }
            processData(data);
        } else {
            // Chunked 或未知長度
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            int ch;
            while ((ch = is.read()) != -1) bos.write(ch);
            processData(bos.toByteArray());
        }
    } catch (ClassCastException e) {
        throw new IllegalArgumentException("Non-HTTP URL: " + url);
    } finally {
        // 6. 關閉資源(依序關閉)
        if (is != null) try { is.close(); } catch (IOException ignore) {}
        if (os != null) try { os.close(); } catch (IOException ignore) {}
        if (conn != null) try { conn.close(); } catch (IOException ignore) {}
    }
}

行動網路架構運作原理

手機應用 → 無線網路 → 營運商 WAP Gateway → Internet → Web Server (Servlet/JSP/PHP/ASP.NET)
                ↑                                                    ↓
                └──────────── 透明轉發(開發者無需關心) ────────────┘

WAP Gateway 負責無線協定(WTP/WTLS)與 HTTP 協定轉換,對開發者完全透明。

四大實戰關鍵原則

1. 必須使用背景執行緒

網路操作會阻塞,絕不可在主執行緒(事件派發執行緒)執行。否則 UI 凍結、甚至被看門狗終止。

new Thread(() -> {
    try { postViaHttpConnection(url); }
    catch (IOException e) { showError(e); }
}).start();

聯網時顯示「載入中」動畫提升使用者體驗。

2. 採用 MVC 模式管理多畫面導航

  • Model:資料存取與快取
  • View:Canvas/CustomItem 畫面繪製
  • Controller:指令分派、狀態機管理畫面切換

3. 資料傳輸格式選擇

方式優點缺點建議場景
GET + URL Encoding簡單、可快取長度限制、資料暴露簡單查詢、靜態資源
POST + application/x-www-form-urlencoded標準、支援較大資料效率一般表單提交、一般 API
POST + DataOutputStream/DataInputStream二進位、高效能、型別安全需雙端協定一致高頻交換、遊戲同步
POST + JSON/XML跨平台、可讀、工具豐富解析耗資源複雜結構資料、Web Service 整合

關鍵:發送端 writeUTF() → 接收端 readUTF(),順序與型別必須完全對應。

4. 標準聯網流程四步驟

  1. 建立連線:Connector.open()、設定方法、Header
  2. 發送資料:openOutputStream()、寫入、flush()
  3. 檢查回應:getResponseCode()、錯誤碼分流處理
  4. 讀取/關閉:openInputStream()、讀取資料、依序關閉所有流與連線

常見陷阱與對策

  • 連線逾時:設定 ConnectionTimeout、實作重試機制
  • 記憶體不足:大資料分塊讀取、避免一次載入巨大陣列
  • 編碼亂碼:統一使用 UTF-8、明確指定 getBytes("UTF-8")
  • 裝置相容性:發布前在目標機型實測,特別是 Socket/SSL 支援度
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved