TCP 方式保持連接,類比打電話:撥號一次(建立連接)即可多次通話(多次傳輸)。傳輸可靠,底層自動重發確保送達。Java 提供良好支持:java.net.Socket 代表客戶端連接,java.net.ServerSocket 代表服務端連接。高度封裝簡化開發,但難以深入底層(如嗅探、IP 包結構)。
創建 Socket 對象,指定服務端 IP 與端口:
Socket socket1 = new Socket("192.168.1.103", 10000);
Socket socket2 = new Socket("www.sohu.com", 80);
底層連接細節透明。網絡不通或服務端未啟動會拋出異常。
從連接獲取輸入/輸出流,遵循「請求-響應」模型:先寫出流發送,再讀入流接收回饋。可嵌套裝飾流便利操作。
OutputStream os = socket1.getOutputStream();
InputStream is = socket1.getInputStream();
socket1.close();
發送 "Hello" 並打印回饋:
package tcp;
import java.io.*;
import java.net.*;
public class SimpleSocketClient {
public static void main(String[] args) {
Socket socket = null;
InputStream is = null;
OutputStream os = null;
String serverIP = "127.0.0.1";
int port = 10000;
String data = "Hello";
try {
socket = new Socket(serverIP, port);
os = socket.getOutputStream();
os.write(data.getBytes());
is = socket.getInputStream();
byte[] b = new byte[1024];
int n = is.read(b);
System.out.println("服務器回饋:" + new String(b, 0, n));
} catch (Exception e) { e.printStackTrace(); }
finally {
try { is.close(); os.close(); socket.close(); } catch (Exception e2) {}
}
}
}
編譯運行:javac -d . SimpleSocketClient.java → java tcp.SimpleSocketClient。搭配下文服務端輸出:服務器回饋:Hello。
ServerSocket ss = new ServerSocket(10000);
監聽本機 10000 端口。端口被佔用會拋異常。
Socket socket = ss.accept();
阻塞方法,等待客戶端連接。連接到達時建立對應 Socket,釋放服務端端口繼續監聽。類比公司前台:客戶到達 → 前台通知對應人員 → 前台繼續接待其他客戶。每個連接佔用一個服務端端口,TCP 最大並發 65535。
獲得的 Socket 與客戶端同樣,但順序相反:先讀入流接收客戶端數據,邏輯處理後寫出流發送回饋。
ss.close();
功能:原樣返回客戶端發送內容。
package tcp;
import java.io.*;
import java.net.*;
public class SimpleSocketServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
OutputStream os = null;
InputStream is = null;
int port = 10000;
try {
serverSocket = new ServerSocket(port);
socket = serverSocket.accept();
is = socket.getInputStream();
byte[] b = new byte[1024];
int n = is.read(b);
System.out.println("客戶端發送內容為:" + new String(b, 0, n));
os = socket.getOutputStream();
os.write(b, 0, n);
} catch (Exception e) { e.printStackTrace(); }
finally {
try { os.close(); is.close(); socket.close(); serverSocket.close(); } catch (Exception e) {}
}
}
}
監聽 → 接受連接 → 讀取輸出 → 回饋 → 關閉。編譯運行命令同客戶端。此示例奠定 TCP 基礎,後續將深入探討進階問題。