首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 網路程式設計精通指南(14):Socket 連接方式大全 — 構造方法 vs connect() 方法

     編輯:Java 相關知識

Java Socket 提供 6 個重載構造方法與 2 個 connect() 重載,支援自動選擇本地 IP、手動綁定本地 IP、超時控制等多樣化連接策略。本文系統歸類並對比各種方式的適用場景。

一、構造方法直連 — 6 種重載分類

1. 自動選擇本地 IP(4 種,最常用)

多網卡/多 IP 機器上,系統自動選擇可達目標的出口 IP。

構造方法參數異常說明
Socket(String host, int port)域名/IP + 端口UnknownHostException, IOException最常用,域名會自動 DNS 解析
Socket(InetAddress addr, int port)InetAddress + 端口IOException預解析 InetAddress,重複連接同一主機效率更高
Socket(String host, int port, boolean stream)+ boolean streamUnknownHostException, IOException@Deprecated stream=false 曾用於 UDP,現棄用
Socket(InetAddress addr, int port, boolean flag)+ boolean flagIOException@Deprecated 同上,不建議使用

2. 手動綁定本地 IP(2 種,多網卡指定出口)

需指定本地 InetAddress 與本地端口(0 表示系統自動分配)。

構造方法參數適用場景
Socket(String host, int port, InetAddress localAddr, int localPort)目標 host/port + 本地 IP/port多網卡指定出口 IP,或需固定本地端口
Socket(InetAddress addr, int port, InetAddress localAddr, int localPort)目標 InetAddress + 本地 IP/port同上,目標預解析為 InetAddress

手動綁定實戰:模擬雙網卡路由選擇

// 假設本機有兩個 IP:200.200.200.200 (連接內網 Server) 和 192.168.18.252 (連接 Internet 經由網關 192.168.18.254)
InetAddress lanIp = InetAddress.getByName("200.200.200.200");
InetAddress wanIp = InetAddress.getByName("192.168.18.252");

// 連接內網服務 200.200.200.4:80 必須用 lanIp
new Socket("200.200.200.4", 80, lanIp, 0).connect(); // 成功

// 連接 Internet www.example.com:80 必須用 wanIp (與網關同網段)
new Socket("www.example.com", 80, wanIp, 0).connect(); // 成功

// 錯誤示範:用 lanIp 連 Internet -> 找不到路由 -> Connection timed out
new Socket("www.example.com", 80, lanIp, 0).connect(); // 失敗

二、connect() 方法 — 分離創建與連接

先 new Socket() 創建未連接對象,再調用 connect(),支援綁定本地地址與超時控制。

1. connect(SocketAddress endpoint)

Socket socket = new Socket();
socket.connect(new InetSocketAddress("host", 80));

2. connect(SocketAddress endpoint, int timeout)

Socket socket = new Socket();
socket.bind(new InetSocketAddress("192.168.1.100", 0)); // 先綁定本地 IP
socket.connect(new InetSocketAddress("host", 80), 2000); // 2秒連接超時

connect() + bind() 組合示例

Socket s1 = new Socket();
s1.connect(new InetSocketAddress("200.200.200.4", 80)); // 自動選 IP 連接

Socket s2 = new Socket();
s2.bind(new InetSocketAddress("200.200.200.200", 0));   // 綁定特定本地 IP
s2.connect(new InetSocketAddress("200.200.200.4", 80));

Socket s3 = new Socket();
s3.bind(new InetSocketAddress("192.168.18.252", 0));
s3.connect(new InetSocketAddress("200.200.200.4", 80), 2000); // 超時 2秒,快速失敗

三、選擇指南

場景推薦方式理由
簡單客戶端,單網卡new Socket(host, port)最簡潔,自動處理 DNS 與路由
高頻連接同一主機InetAddress addr = ...; new Socket(addr, port)避免重複 DNS 解析
多網卡指定出口 IP構造方法帶 localAddr 或 bind() + connect()精確控制源 IP
需連接超時控制connect(address, timeout)構造方法無超時參數
連接前需設置 Socket 選項new Socket() -> setOption -> connect()構造方法直連無法預先設置選項
非阻塞連接 (NIO)SocketChannel.open() -> connect()屬於 NIO 範疇,非本文範圍

關鍵提醒

  • 攜帶 boolean stream 參數的構造方法已 @Deprecated,嚴禁在新代碼使用。
  • 手動綁定本地端口時,localPort=0 讓系統自動分配(1024~65535),避免衝突。
  • bind() 必須在 connect() 前調用,且只能調用一次。
  • 所有連接操作均需包裹在 try-catch 或拋出 IOException。

靈活掌握這些連接方式,能讓你的網路客戶端適應從簡單單機到複雜多網卡、高可用、低延遲的各種部署拓撲。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved