| 特性 | 面向連線 | 無連線 |
|---|---|---|
| 協議 | TCP | UDP |
| 比喻 | 電話通話 | 郵件投遞 |
| 連線建立 | 三向交握 | 無需連線 |
| 可靠性 | 有序、不丟失、無重複 | 不保證到達/順序/完整 |
| 效率 | 較低(握手、確認、重傳) | 高(無連線開銷) |
| 適用場景 | 檔案傳輸、資料庫、郵件 | 串流媒體、遊戲、DNS、日誌 |
| Java類別 | Socket / ServerSocket | DatagramSocket / DatagramPacket |
public class TcpClient {
public static void main(String[] args) throws IOException {
try (Socket socket = new Socket("localhost", 8888);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()))) {
out.println("GET / HTTP/1.1");
out.println("Host: localhost");
out.println();
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
}
}
public class TcpServer {
public static void main(String[] args) throws IOException {
try (ServerSocket serverSocket = new ServerSocket(8888)) {
System.out.println("伺服器啟動,等待連線...");
while (true) {
Socket clientSocket = serverSocket.accept();
new Thread(() -> handleClient(clientSocket)).start();
}
}
}
private static void handleClient(Socket socket) {
try (BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
String requestLine = in.readLine();
System.out.println("收到請求:" + requestLine);
out.println("HTTP/1.1 200 OK");
out.println("Content-Type: text/plain");
out.println();
out.println("Hello from TCP Server!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
try (DatagramSocket socket = new DatagramSocket()) {
byte[] sendData = "TIME_REQUEST".getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData, sendData.length, InetAddress.getByName("localhost"), 9999);
socket.send(sendPacket);
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
socket.receive(receivePacket);
System.out.println("回應:" + new String(receivePacket.getData(), 0, receivePacket.getLength()));
}
try (DatagramSocket socket = new DatagramSocket(9999)) {
byte[] buffer = new byte[1024];
while (true) {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String request = new String(packet.getData(), 0, packet.getLength());
String response = new Date().toString();
byte[] respData = response.getBytes();
DatagramPacket respPacket = new DatagramPacket(
respData, respData.length, packet.getAddress(), packet.getPort());
socket.send(respPacket);
}
}
現代高效能網路程式常採用NIO(Selector、SocketChannel)實現非阻塞IO,單執行緒處理萬級連線,這是進階學習方向。