在 Android 應用中使用 Socket 進行 TCP 通訊時,開發者常遇到一個棘手的問題:客戶端成功連接伺服器並接收第一條訊息後,當伺服器發送第二條訊息時,應用程式卻直接崩潰退出,且無明顯錯誤日誌輸出。
典型的問題程式碼結構如下:
Thread aa = new Thread(new Runnable() {
@Override
public void run() {
try {
client = new Socket(InetAddress.getByName("192.168.1.101"), 4312);
BufferedReader read = new BufferedReader(new InputStreamReader(client.getInputStream()));
rec.setText("123"); // UI 更新需在主執行緒
String s = "";
while (true) {
s = read.readLine(); // 阻塞等待數據
rec.setText(s); // 直接在子執行緒更新 UI
}
} catch (IOException e) {
rec.setText("123123");
}
}
});
aa.start();
while (true) {
String s = read.readLine();
if (s == null) break; // 對方關閉連線
final String msg = s;
runOnUiThread(() -> rec.setText(msg));
}
try (Socket socket = new Socket(...);
BufferedReader reader = new BufferedReader(...)) {
String line;
while ((line = reader.readLine()) != null) {
// 處理數據
}
} catch (IOException e) {
Log.e("Socket", "通訊異常", e);
} finally {
// 確保關閉資源
}
建議使用 OkHttp、Netty 或 Android 官方推薦的 `Socket` 封裝庫,自動處理重連、心跳、執行緒切換等細節,降低出錯機率。
掌握上述要點,即可徹底解決 Android Socket TCP 通訊「只能收一次訊息就崩潰」的問題,構建穩定可靠的網路通訊模組。