Java - Socket 類別與範例

你好,有志於Java編程的你!今天,我們將踏上一段令人興奮的旅程,進入使用Java Socket類別進行網絡編程的世界。作為你親切友善的鄰居計算機科學老師,我非常高興能夠引導你走過這次冒險。別擔心如果你是編程新手——我們會從基礎開始,逐步學習。那麼,戴上你的虛擬安全帽,我們一起來深入探索吧!

Java - Socket Class

什麼是 Socket?

在我們跳進代碼之前,讓我們先了解一下什麼是 Socket。想像你正在試圖給朋友打電話。你需要兩樣東西:朋友的電話號碼和一部電話來打這個電話。在計算機網絡中,Socket就像那部電話一樣——它是兩個運行在網絡上的程序之間雙向通信連接的終點。

Java Socket 類別

Java Socket類別代表客戶端 Socket。它是java.net包的一部分,為程序提供了與網絡上其他程序通信的方式。

宣告

要使用Socket類別,你首先需要導入它:

import java.net.Socket;

构造函数

Socket類別有幾個构造函数。以下是最常見的幾個:

构造函数 描述
Socket() 創建一個未連接的 Socket
Socket(String host, int port) 創建一個 Socket 並將其連接到指定的主機和端口
Socket(InetAddress address, int port) 創建一個 Socket 並將其連接到指定的 IP 地址和端口

方法

Socket類別提供了各種方法來管理連接和傳輸數據。以下是一些重要的方法:

方法 描述
connect(SocketAddress endpoint) 將這個 Socket 連接到服務器
getInputStream() 返回從這個 Socket 讀取字節的輸入流
getOutputStream() 返回向這個 Socket 寫入字節的輸出流
close() 關閉這個 Socket
isClosed() 返回這個 Socket 是否已經關閉
isConnected() 返回這個 Socket 是否已經連接

Socket 客戶端範例

現在,讓我們創建一個簡單的客戶端,它連接到服務器並發送一個消息。如果你現在還不理解所有內容,別擔心——我們會一步步分解。

import java.io.*;
import java.net.*;

public class SimpleSocketClient {
public static void main(String[] args) {
try {
// 創建一個 Socket 並連接到服務器
Socket socket = new Socket("localhost", 12345);
System.out.println("已連接到服務器!");

// 創建輸出流以向服務器發送數據
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

// 向服務器發送消息
out.println("你好,服務器!這是客戶端發來的消息。");

// 創建輸入流以從服務器接收數據
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// 讀取服務器的回應
String response = in.readLine();
System.out.println("服務器說:" + response);

// 關閉連接
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

讓我們分解這段代碼:

  1. 我們從導入進行輸入/輸出操作和網絡編程所需的類開始。

  2. main方法中,我們將代碼包在try-catch塊中,以處理可能的IOException

  3. 我們創建一個新的Socket對象,指定服務器地址(在這個例子中是"localhost",意味著同一台機器)和端口号(12345)。

  4. 我們創建一個PrintWriter以通過Socket的輸出流向服務器發送數據。

  5. 我們使用println方法向服務器發送消息。

  6. 我們創建一個BufferedReader以通過Socket的輸入流從服務器接收數據。

  7. 我們使用readLine方法讀取服務器的回應並打印它。

  8. 最後,我們關閉所有流和Socket以釋放資源。

現在,你可能會想,"但是等等,服務器在哪裡?" 好問題!為了讓這個客戶端工作,我們需要一個在相同端口上監聽的服務器。讓我們創建一個簡單的服務器來完成我們的範例。

import java.io.*;
import java.net.*;

public class SimpleSocketServer {
public static void main(String[] args) {
try {
// 創建一個服務器 Socket
ServerSocket serverSocket = new ServerSocket(12345);
System.out.println("服務器正在等待客戶端...");

// 等待客戶端連接
Socket clientSocket = serverSocket.accept();
System.out.println("客戶端已連接!");

// 創建輸入流以從客戶端接收數據
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

// 創建輸出流以向客戶端發送數據
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

// 讀取客戶端的消息
String message = in.readLine();
System.out.println("客戶端說:" + message);

// 向客戶端發送回應
out.println("消息已收到,謝謝!");

// 關閉連接
in.close();
out.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

這個服務器代碼做以下事情:

  1. 在端口12345上創建一個ServerSocket

  2. 使用accept方法等待客戶端連接。

  3. 一旦客戶端連接,它就創建輸入和輸出流。

  4. 讀取客戶端的消息並打印。

  5. 向客戶端發送回應。

  6. 關閉所有連接。

要運行這個範例:

  1. 首先運行SimpleSocketServer類。

  2. 然後運行SimpleSocketClient類。

你應該會看到客戶端連接到服務器,發送消息,並接收回應!

結論

恭喜你!你剛剛使用Java Sockets創建了你們的第一個客戶端-服務器應用程序。這只是網絡編程的冰山一角,但這是一個非常好的開始。

記住,Sockets就像電話一樣——它們讓程序能夠在網絡上相互通話。有了這個知識,你可以開始构建更複雜的網絡應用程序,如聊天程序、多人遊戲或分布式系統。

在你繼續Java之旅時,不要忘記探索其他網絡編程類如ServerSocketURLURLConnection。這些都為創建有強大連接功能的應用程序打開了新的可能性。

繼續練習,保持好奇心,並且快樂編程!

Credits: Image by storyset