Socket(套接字)是網路通訊的基礎抽象,代表兩台機器間連線的「端點」。Java 在 java.net 套件提供 Socket(客戶端)與 ServerSocket(伺服器端)類別,封裝了 TCP 協定的複雜細節,讓開發者專注於業務邏輯而非底層網路操作。
public class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("Server started on port 8000...");
Socket clientSocket = serverSocket.accept(); // 阻塞等待客戶連線
System.out.println("Client connected: " + clientSocket.getInetAddress());
DataInputStream in = new DataInputStream(clientSocket.getInputStream());
PrintStream out = new PrintStream(clientSocket.getOutputStream());
out.println("Welcome to Java Socket Server!");
String inputLine;
while ((inputLine = in.readLine()) != null) {
if ("quit".equalsIgnoreCase(inputLine)) break;
System.out.println("Client said: " + inputLine);
out.println("Echo: " + inputLine); // 回應客戶
}
// 資源釋放
in.close();
out.close();
clientSocket.close();
serverSocket.close();
}
}
public class TcpClient {
public static void main(String[] args) throws IOException {
if (args.length < 1) {
System.out.println("Usage: java TcpClient ");
return;
}
Socket socket = new Socket(args[0], 8000);
System.out.println("Connected to server");
DataInputStream in = new DataInputStream(socket.getInputStream());
PrintStream out = new PrintStream(socket.getOutputStream());
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
// 讀取伺服器歡迎訊息
System.out.println("Server: " + in.readLine());
String userInput;
while ((userInput = keyboard.readLine()) != null) {
out.println(userInput); // 發送給伺服器
if ("quit".equalsIgnoreCase(userInput)) break;
System.out.println("Server echo: " + in.readLine()); // 讀取回應
}
// 資源釋放
keyboard.close();
in.close();
out.close();
socket.close();
}
}
javac TcpServer.java TcpClient.javajava TcpServerjava TcpClient 127.0.0.1quit 結束連線accept() 後的處理邏輯移至獨立執行緒,支援多客戶端並發SSLSocket/SSLServerSocket 保障傳輸安全java.nio.channels 實作高併發伺服器連線被拒絕:確認伺服器已啟動、埠號正確、防火牆允許通訊。
中文亂碼:統一指定編碼 new InputStreamReader(is, "UTF-8")。
資料傳輸不完整:TCP 為串流協定,需自行定義訊息邊界(長度前綴、分隔符、固定長度)。