首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android Socket 通訊完整實作指南:TCP/UDP 模型與客戶端/伺服器端代碼

     編輯:Java 相關知識

Socket 通訊基礎

Android 與伺服器通訊兩大方式:

  • HTTP:請求-回應模式,連線短暫,客戶端主動發起
  • Socket:長連線雙向通道,建立後雙方可主動推送,資料損失率低、易移植

兩大 Socket 類型

類型協定特性適用場景
流式 SocketTCP可靠、有序、面向連線、位元組流即時通訊、檔案傳輸、指令控制
資料報 SocketUDP不可靠、無序、無連線、資料報文廣播、視訊串流、即時遊戲狀態同步

TCP Socket 核心流程

伺服器端

  1. ServerSocket server = new ServerSocket(port) 監聽埠
  2. Socket client = server.accept() 阻塞等待連線
  3. InputStream in = client.getInputStream() 讀取資料
  4. OutputStream out = client.getOutputStream() 發送回應
  5. 關閉流與 Socket

客戶端

  1. Socket socket = new Socket(serverIP, port) 發起連線
  2. OutputStream out = socket.getOutputStream() 發送資料
  3. InputStream in = socket.getInputStream() 接收回應
  4. 設定 socket.setSoTimeout(毫秒) 防止無限阻塞

完整代碼實作

Java 伺服器端(PC 端執行)

public class SimpleServer {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(30000);
        System.out.println("伺服器啟動,監聽 30000...");

        while (true) {
            Socket s = ss.accept();
            System.out.println("客戶端連線:" + s.getInetAddress());

            try (OutputStream os = s.getOutputStream()) {
                os.write("您好,收到伺服器新年祝福!\n".getBytes("UTF-8"));
            }
            s.close();
        }
    }
}

Android 客戶端

public class SimpleClient extends Activity {
    private TextView tvResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tvResult = findViewById(R.id.show);

        new Thread(() -> {
            try {
                Socket socket = new Socket("192.168.1.100", 30000); // 替換為實際伺服器 IP
                socket.setSoTimeout(10000);

                BufferedReader br = new BufferedReader(
                        new InputStreamReader(socket.getInputStream(), "UTF-8"));
                String msg = br.readLine();

                runOnUiThread(() -> tvResult.setText("伺服器回應:" + msg));

                br.close();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
                runOnUiThread(() -> tvResult.setText("連線失敗:" + e.getMessage()));
            }
        }).start();
    }
}

AndroidManifest.xml 權限

<uses-permission android:name="android.permission.INTERNET"/>

UDP 通訊核心流程

伺服器端

DatagramSocket server = new DatagramSocket(4567);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
server.receive(packet); // 阻塞接收
String received = new String(packet.getData(), 0, packet.getLength());

客戶端

DatagramSocket client = new DatagramSocket();
InetAddress addr = InetAddress.getByName("192.168.1.100");
String msg = "Hello UDP";
byte[] data = msg.getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, addr, 4567);
client.send(packet);

Android 實戰注意事項

  1. 主執行緒禁網:Socket 操作必須在子執行緒(Thread/AsyncTask/RxJava/Coroutines)
  2. 生命週期管理:Activity 銷毀時關閉 Socket,避免資源洩漏
  3. 斷線重連:實作心跳機制與指數退避重連邏輯
  4. 編碼統一:客戶端/伺服器雙方約定 UTF-8,明確指定 new String(bytes, "UTF-8")
  5. 緩衝區處理:TCP 為流協定,需自行定義訊息邊界(定長、分隔符、長度前綴)

進階架構建議

  • 使用 Handler 或 LiveData 將網路層回調傳遞給 UI 層
  • 封裝 SocketManager 單例管理連線狀態、發送隊列、重連邏輯
  • 考慮成熟框架:Netty(高效能)、OkSocket(輕量封裝)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved