// IP 連接
Socket socket = new Socket("192.168.1.100", 8080);
// 域名連接(內部自動 DNS 解析)
Socket socket = new Socket("www.example.com", 80);
構造方法會阻塞直到連接成功或超時拋出異常。
// 獲取流
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
// 發送(建議加 BufferedWriter 提升效率)
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write("GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n");
bw.flush(); // 必須 flush,否則數據停留在緩衝區
// 接收
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
| 方式 | 代碼 | 特點 |
|---|---|---|
| Socket.close() | socket.close() | 標準、立即釋放資源 |
| 關閉流 | socket.getInputStream().close() | 流關閉觸發 Socket 關閉 |
| 程序退出 | JVM 退出 | 非優雅,可能殘留連接 |
| GC 回收 | socket = null | 不可控,不推薦 |
socket.isConnected() // 是否曾經連接成功
socket.isClosed() // 當前是否關閉
// 真正處於連接狀態:!isClosed() && isConnected()
socket.shutdownOutput(); // 僅關閉發送,仍可接收
socket.shutdownInput(); // 僅關閉接收
socket.isOutputShutdown();
socket.isInputShutdown();
for (int port = 1; port <= 65535; port++) {
try (Socket s = new Socket("localhost", port)) {
System.out.println("Port " + port + " open");
} catch (IOException ignored) {}
}