在 Android 設備上運行 WebSocket Server,供 Web 瀏覽器/其他客戶端建立長連接通訊。
| 方案 | 核心庫 | 優勢 | 劣勢 | 適用場景 |
|---|---|---|---|---|
| Java 原生 ServerSocket + 手寫握手 | 無第三方 | 零依賴、完全可控 | 需自行實現 RFC 6455 協議、幀解析、心跳、重連,易出 Bug | 極簡原型、教學 |
| Netty (netty-all) | io.netty:netty | 高性能、事件驅動、內建 WebSocket 編解碼、SSL、流控 | 體積 ~3MB、API 複雜、需處理 Android 線程模型 | 高併發、生產級、需 TLS |
| TooTallNate/Java-WebSocket | org.java-websocket:Java-WebSocket | 輕量 (~200KB)、API 簡單、支持客戶端/服務端、Android 兼容良好 | 單線程模型擴展性弱、無原生後壓 | 中小型設備端 Server、快速集成 |
| OkHttp WebSocket (僅客戶端) | com.squareup.okhttp3:okhttp | 現代、支持 HTTP/2、自動重連 | 不支持 Server 端 | 僅作客戶端 |
| Ktor (Kotlin 協程) | io.ktor:ktor-server-netty | 協程非阻塞、DSL 簡潔、多平台 | 需引入 Kotlin 標準庫、體積較大 | Kotlin 優先項目、協程愛好者 |
// build.gradle
implementation 'org.java-websocket:Java-WebSocket:1.5.4'
// Server 代碼
public class WsServer extends WebSocketServer {
public WsServer(InetSocketAddress addr) { super(addr); }
@Override public void onOpen(WebSocket conn, ClientHandshake hand) {
conn.send("Welcome from Android!");
}
@Override public void onMessage(WebSocket conn, String msg) {
broadcast(msg); // 群發
}
@Override public void onClose(WebSocket conn, int code, String reason, boolean remote) {}
@Override public void onError(WebSocket conn, Exception ex) { ex.printStackTrace(); }
}
// 啟動 (在 Service 或 Application 中)
WsServer server = new WsServer(new InetSocketAddress(8888));
server.start();
<uses-permission android:name="android.permission.INTERNET"/>;Foreground Service 並顯示通知;REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 避免休眠斷開;onDestroy() 中調用 server.stop(1000) 優雅關閉。輕量場景首選 Java-WebSocket,高性能/企業級選 Netty,Kotlin 項目考慮 Ktor。務必解決 Android 後台存活與網絡可達性問題。