Socket(套接字/插座)是軟體形式的抽象,表達兩台機器間連線的「終端」。對特定連線,每台機器各有一個 Socket,想像中間有一條虛擬「纜線」,兩端各插入一個 Socket。物理硬體與纜線連接細節完全未知——抽象的宗旨就是讓我們盡可能不需知道那些細節。
在 Java 中建立 Socket 以建立與其他機器的連線。從 Socket 獲得 InputStream 與 OutputStream(配合轉換器可得 Reader/Writer),將連線視為 IO 流物件處理。
兩個基於串流的 Socket 類別:
ServerSocket:伺服器用於「偵聽」進入的連線Socket:客戶端用於發起連線客戶端申請連線後,ServerSocket 透過 accept() 回傳對應的伺服器端 Socket,雙方形成真正的「Socket-to-Socket」連線。此時兩端完全對稱,可用相同方式處理。利用 getInputStream()、getOutputStream() 產生對應串流,封裝進緩衝區,按第 10 章方法格式化,如同處理其他流物件。
Java 庫命名機制中,ServerSocket 易產生誤解。許以為應叫 ServerConnector 或其他名字,不該含「Socket」。也可能以為兩者應繼承共同基底類。事實上它們確有幾個共同方法,但不足以構成共同基底類。
ServerSocket 真正任務: 耐心等待其他機器連線,再回傳一個實際的 Socket。命名不當在於:它的目標不是成為 Socket,而是在他人連線時產生 Socket 物件。
然而,ServerSocket 確實在主機上建立物理「伺服器」或偵聽 Socket。此 Socket 偵聽連線請求,透過 accept() 回傳「已建立」Socket(本地與遠端端點均已定義)。混淆點在於:偵聽 Socket 與已建立 Socket 都關聯同一個 ServerSocket。偵聽 Socket 只能接受新連線請求,不能接收實際資料封包。所以雖 ServerSocket 對編程意義不大,但它確實是「物理性」的。