Java 平台在 java.net 套件中實作 Socket 通訊。本文將介紹該套件中最常用的三個核心類別:
URLConnectionSocketServerSocketjava.net 還包含更多類別,但這三個是開發中最常遇到的。我們先從 URLConnection 開始,它提供在 Java 程式碼中使用 Socket 的方法,無需了解底層機制。
連接到一個 URL 包含以下步驟:
URLConnectionURLConnection下面我們透過範例示範如何使用 URLConnection 從伺服器請求文件。
我們先從 URLClient 類別的結構開始講起。
import java.io.*;
import java.net.*;
public class URLClient {
protected URLConnection connection;
public static void main(String[] args) { }
public String getDocumentAt(String urlString) { }
}
注意:必須先導入 java.net 和 java.io 套件。
我們給類別一個實例變數用於保存 URLConnection。類別包含 main() 方法處理瀏覽文件的邏輯流,以及 getDocumentAt() 方法用於連接伺服器並請求文件,下面我們將探究這些方法的細節。
main() 方法處理瀏覽文件的邏輯流:
public static void main(String[] args) {
URLClient client = new URLClient();
String yahoo = client.getDocumentAt("https://www.yahoo.com");
System.out.println(yahoo);
}
main() 方法僅建立一個新的 URLClient 實例,並使用有效的 URL 字串呼叫 getDocumentAt() 方法。當呼叫返回文件時,我們將其儲存在 String 中並輸出到控制台。然而,實際工作是在 getDocumentAt() 方法中完成的。
getDocumentAt() 方法處理實際如何從網路上取得文件:
public String getDocumentAt(String urlString) {
StringBuffer document = new StringBuffer();
try {
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
document.append(line + "\n");
}
reader.close();
} catch (MalformedURLException e) {
System.out.println("Unable to connect to URL: " + urlString);
} catch (IOException e) {
System.out.println("IOException when connecting to URL: " + urlString);
}
return document.toString();
}
getDocumentAt() 方法接受一個包含目標文件 URL 的 String 參數。我們先建立 StringBuffer 儲存文件行。接著用傳入的 urlString 建立 URL 物件,建立 URLConnection 並開啟連線:
URLConnection conn = url.openConnection();
取得 URLConnection 後,取得其 InputStream 並包裝為 InputStreamReader,再包裝為 BufferedReader 以便讀取伺服器回傳的文件行。這種包裝技術在處理 Socket 時常用,務必熟悉:
BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
有了 BufferedReader,即可輕鬆讀取文件內容。在 while 迴圈中呼叫 readLine() 方法:
String line = null;
while ((line = reader.readLine()) != null) {
document.append(line + "\n");
}
呼叫 readLine() 從 InputStream 讀入行結束符(如換行符)時會阻塞;若無資料則持續等待,連線關閉時回傳 null。取得一行後,連同換行符附加到 StringBuffer,保留原文件格式。
讀取完所有行後,關閉 BufferedReader:
reader.close();
若提供給 URL 建構子的 urlString 無效,會拋出 MalformedURLException;其他錯誤(如取得 InputStream 失敗)則拋出 IOException。
URLInputStream 包裝為 BufferedReader 以讀取行BufferedReader 讀取文件內容BufferedReader