在 J2ME 應用程式開發中,網路通訊是核心功能之一。然而,受限於行動裝置的硬體資源與網路環境,開發者常需在可用性與效能之間取捨。本文透過實際測試,深入探討 J2ME 裝置上 HTTP 與 Socket 協定的連線與傳輸效能,並提供具體程式碼範例,供開發者參考。
測試專注於 J2ME 裝置的網路連線效能,採用通用連接架構(Generic Connection Framework, GCF)中的 HttpConnection 與 StreamConnection(Socket 協定)進行資料上傳、下載、中文編碼處理、傳輸計時以及加密解密等操作。為確保通用性,未使用特定裝置的專屬類別。
測試資料包含:建立連線所需時間(第一筆),以及連線建立後的 9 次資料傳輸時間,最後一筆為前 9 筆的平均值。
測試裝置涵蓋 Sun WTK 模擬器、Nokia 6610、Nokia 7650、Nokia 6600、Sony Ericsson P802。以下為關鍵數據摘要(單位:秒):
| 裝置 | 協定 | 連線時間 | 平均傳輸時間 |
|---|---|---|---|
| Sun WTK 模擬器 | HTTP | 1.391 | 0.318 |
| Sun WTK 模擬器 | Socket | 0.500 | 0.378 |
| Nokia 6610 | HTTP | 4.258 | 1.741 |
| Nokia 6610 | Socket | 不支援 | — |
| Nokia 7650 | HTTP | 7.812 | 2.712 |
| Nokia 7650 | Socket | 1.719 | 2.076 |
| Nokia 6600 | HTTP | 3.937 | 1.873 |
| Nokia 6600 | Socket | 3.188 | 1.579 |
| Sony Ericsson P802 | HTTP | 7.484 | 1.687 |
| Sony Ericsson P802 | Socket | 1.360 | 1.362 |
public class Game extends MIDlet implements CommandListener {
private Display display;
private Form fmHTTP, fmStream, fmSocket;
private Command cmdTest, cmdStream, cmdSocket, cmdHTTP;
private TestThread testThread;
public Game() {
display = Display.getDisplay(this);
// 初始化表單與指令...
testThread = new TestThread(getAppProperty("Server").toLowerCase().trim());
}
class TestThread implements Runnable {
private String server, message;
private Form curForm;
private HttpConnection conHttp;
private StreamConnection conStream;
public TestThread(String server) { this.server = server; }
public void start(Form curForm) {
this.curForm = curForm;
new Thread(this).start();
}
public void run() {
long start = System.currentTimeMillis();
int formId = Integer.parseInt(curForm.getTitle().substring(0,1));
try {
if (formId == 1) { // HTTP 測試
String key = genPassWord();
conHttp = (HttpConnection) Connector.open("https://" + server + ":8080/ns/hellodes?r=" + key);
int rc = conHttp.getResponseCode();
if (rc == HttpConnection.HTTP_OK) {
InputStream is = conHttp.openInputStream();
byte[] data = new byte[(int)conHttp.getLength()];
is.read(data);
// DES 解密與 GB 解碼...
message = gbDecode(new String(data));
}
} else if (formId == 3) { // Stream (Socket) 測試
conStream = (StreamConnection) Connector.open("socket://" + server + ":10000", Connector.READ_WRITE);
InputStream is = conStream.openInputStream();
// 讀取資料並解碼...
}
} catch (Exception e) {
message = e.getMessage();
} finally {
// 更新 UI 顯示結果...
}
}
}
}
針對即時性需求高的應用,建議優先採用 Socket 協定並自行設計二進位封包格式,減少文字編碼開銷;同時在伺服器端部署專用遊戲伺服器以降低回應延遲。對於一般資訊查詢類應用,HTTP 協定兼容性較佳,仍為首選。