在 J2ME 移動應用開發中,為了節省用戶流量費用,支援中國移動 CMWAP 代理幾乎是標配。HTTP 請求自然能通過 CMWAP 轉發,但 Socket 長連接卻面臨阻礙——CMWAP 本質是 HTTP 代理服務器,不直接轉發原始 TCP 數據流。如何在 Socket 層面實現穿透?
CMWAP 標準 HTTP 代理能力,能處理基於 HTTP 協議的轉發請求。解決思路是:建立 Socket 與 CMWAP 連接,但發送符合 HTTP 協議格式的請求報文。代理解析 HTTP Header 後,會將請求轉發至目標服務器,並將響應原路返回。這實現了「Socket 介面,HTTP 協議,代理轉發」的混合模式。
package cmwaptest;
import java.io.*;
import javax.microedition.io.*;
public class CmwapThread extends Thread {
CmwapForm cf;
public CmwapThread(CmwapForm cf) {
this.cf = cf;
}
public void run() {
try {
cf.displayInfo("開始建立連接!");
// 連接 CMWAP 代理網關 (10.0.0.172:80)
SocketConnection sc = (SocketConnection) Connector.open("socket://10.0.0.172:80");
cf.displayInfo("連接建立完畢!");
OutputStream os = sc.openOutputStream();
// 構造標準 HTTP GET 請求,目標 URL 寫在請求行
String requestLine = "GET https://www.freewebs.com/cqucyf/a.htm HTTP/1.0\r\n";
String header = "Accept: */*\r\n\r\n";
os.write(requestLine.getBytes());
os.write(header.getBytes());
os.flush();
cf.displayInfo("數據發送完畢!");
InputStream is = sc.openInputStream();
byte[] data = new byte[10240];
int num = is.read(data);
cf.displayInfo("數據接收完畢!數據長度:" + num);
cf.doStr(data, num); // 業務處理
sc.close();
} catch (Exception e) {
cf.doError(e.toString());
}
}
}
SocketConnection 實例,循環發送多個請求,實現真正的會話級長連接。此技術適合數據量中等、需頻繁交互、對成本敏感的 J2ME 應用(如即時通訊、股票行情、簡易推送)。局限在於:
Socket 封裝 HTTP 穿透 CMWAP,是 J2ME 時代在網絡受限環境下的一項巧妙工程實踐。它以最小改動成本,兼顧了費用、性能與架構兼容性,展現了移動互聯網早期開發者的智慧。雖然 4G/5G 時代此技術已淡出主流,但其「協議適配、分層解耦」的思想在物聯網弱網環境開發中仍具參考價值。