首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android UDP 通訊:DatagramSocket 建立失敗的正確執行緒處理

     編輯:程式設計綜合問答

問題現象

在 `onCreate` 中直接 `new DatagramSocket(50000)` 拋出 `SocketException`,真機測試同樣失敗,換端口無效。Java 專案卻正常。

根因

Android 主執行緒(UI 執行緒)禁止執行網路 I/O 操作(API 9+ 嚴格模式會拋 `NetworkOnMainThreadException`,舊版直接失敗)。必須在子執行緒中建立 Socket 並收發資料。

修正程式碼

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new Thread(() -> {
        try {
            DatagramSocket socket = new DatagramSocket(50000);
            // 收發邏輯...
            byte[] buf = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            socket.receive(packet); // 阻塞等待
            // 處理資料...
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }).start();
}

完整通訊架構建議

  • 使用 `Handler` 或 `runOnUiThread` 將收到的資料傳回 UI 執行緒更新介面。
  • 在 `onDestroy` 中關閉 Socket、停止執行緒,避免洩漏。
  • 若需頻繁收發,考慮 `IntentService` 或 `Coroutine` 管理生命週期。
  • 記得在 `AndroidManifest.xml` 宣告權限:<uses-permission android:name="android.permission.INTERNET"/>。

將網路操作移出主執行緒,即可解決 `DatagramSocket` 建立失敗問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved