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

Java 網路程式設計精通指南(17):Socket 核心 getter 方法詳解(一)

     編輯:Java 相關知識

Socket 類提供豐富的 getter 方法,用於獲取連接的遠端/本地地址信息及輸入輸出流。本文系統梳理這些方法,並說明其在連接生命週期不同階段的可用性。

一、獲取遠端服務器信息

客戶端連接成功後,可通過以下三種方式獲取服務端 IP 與端口:

1. getInetAddress() — 返回 InetAddress 對象

Socket socket = new Socket("www.example.com", 80);
InetAddress addr = socket.getInetAddress();
System.out.println("Server IP: " + addr.getHostAddress());   // 如 93.184.216.34
System.out.println("Server Host: " + addr.getHostName());    // 如 www.example.com

2. getPort() — 直接獲取端口號

int port = socket.getPort(); // 返回 80

3. getRemoteSocketAddress() — 組合地址對象

返回 SocketAddress(實為 InetSocketAddress),需向下轉型:

SocketAddress remote = socket.getRemoteSocketAddress();
InetSocketAddress isa = (InetSocketAddress) remote;
System.out.println("Host: " + isa.getHostName());
System.out.println("Port: " + isa.getPort());
重要特性:以上三個方法在 socket.close() 後仍可調用,返回值保持有效。若直接用 IP 連接,getHostName() 返回的也是該 IP。

二、獲取本地綁定信息

對應本機用於此連接的 IP 與端口:

1. getLocalAddress() — 本地 InetAddress

Socket socket = new Socket();
socket.connect(new InetSocketAddress("www.example.com", 80));
InetAddress local = socket.getLocalAddress();
System.out.println("Local IP: " + local.getHostAddress());
System.out.println("Local Host: " + local.getHostName());

多網卡/多 IP 機器上,返回實際用於建立連接的那張網卡 IP。ADSL 撥號場景下可獲取臨時公網 IP。

2. getLocalPort() — 本地端口號

int localPort = socket.getLocalPort(); // 系統自動分配的臨時端口

3. getLocalSocketAddress() — 組合本地地址

InetSocketAddress localIsa = (InetSocketAddress) socket.getLocalSocketAddress();
System.out.println("Bound IP: " + localIsa.getAddress().getHostAddress());
System.out.println("Bound Port: " + localIsa.getPort());

三、獲取輸入/輸出流

數據收發的核心入口:

1. getInputStream() — 讀取服務端數據

InputStream in = socket.getInputStream();
// 建議包裝為緩衝字符流
BufferedReader br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
String line = br.readLine();

2. getOutputStream() — 發送數據到服務端

OutputStream out = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8));
bw.write("Hello Server\r\n");
bw.flush(); // 必須 flush,將緩衝區數據推送至網路
關鍵提醒:
  • OutputStream 預設 8KB 緩衝,flush() 才真正發送。
  • 讀取字符串必須用 BufferedReader.readLine();InputStreamReader 無此方法。
  • 流關閉會導致 Socket 關閉,詳見後續「關閉連接」章節。

方法可用性總結表

方法連接前連接後關閉後
getInetAddress / getPort / getRemoteSocketAddressnull / 0 / null有效有效
getLocalAddress / getLocalPort / getLocalSocketAddressnull / -1 / null有效有效
getInputStream / getOutputStream拋異常有效拋異常

掌握這些 getter,能讓你在連接建立、數據傳輸、連接關閉等各階段精確獲取所需上下文信息。

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