項目背景
一款多人在線棋牌手遊,客戶端為功能機(J2ME),透過 GPRS 與伺服器通訊。面臨兩大挑戰:手機算力極弱、流量費昂貴(按 KB 計費)。
技術選型:Java vs C++
- C++:效能高,但開發周期長、記憶體管理易出錯,易變成「代碼噩夢」
- Java:網絡庫豐富、開發效率高、垃圾回收降低心智負擔、難寫出不可維護代碼
- 結論:選擇 Java,並在 Linux 環境部署
網絡協議演進
初嘗 HTTP → 放棄
- 優點:J2ME 全支持、封裝度高(無需自管線程/同步/連接池)
- 缺點:
- 無狀態:需輪詢拉取數據,實時性差
- 流量驚人:每請求攜帶大量 HTTP Head,測試一局牌耗費 1 元以上(每秒輪詢),不可接受
轉向 Socket + Java NIO
- 基於事件驅動的異步非阻塞 I/O,單線程可管理海量連接
- 每客戶端一條
SocketChannel,生命週期持久化
- 斷線檢測:讀取返回
-1 或捕獲 Connection reset 異常,及時清理資源
- 省去複雜線程管理,適合高併發長連接場景
自建基礎設施
棄用 Web 容器意味著需自行實現:線程管理、客戶端狀態監控、對象池、管理控制台等,但換來極致的流量控制與實時推送能力。