Android 與伺服器通訊兩大方式:
| 類型 | 協定 | 特性 | 適用場景 |
|---|---|---|---|
| 流式 Socket | TCP | 可靠、有序、面向連線、位元組流 | 即時通訊、檔案傳輸、指令控制 |
| 資料報 Socket | UDP | 不可靠、無序、無連線、資料報文 | 廣播、視訊串流、即時遊戲狀態同步 |
ServerSocket server = new ServerSocket(port) 監聽埠Socket client = server.accept() 阻塞等待連線InputStream in = client.getInputStream() 讀取資料OutputStream out = client.getOutputStream() 發送回應Socket socket = new Socket(serverIP, port) 發起連線OutputStream out = socket.getOutputStream() 發送資料InputStream in = socket.getInputStream() 接收回應socket.setSoTimeout(毫秒) 防止無限阻塞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();
}
}
}
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();
}
}
<uses-permission android:name="android.permission.INTERNET"/>
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);
new String(bytes, "UTF-8")Handler 或 LiveData 將網路層回調傳遞給 UI 層SocketManager 單例管理連線狀態、發送隊列、重連邏輯