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

Java Socket 網路程式設計完整入門指南

     編輯:Java 相關知識

從 TCP/IP 基礎到多執行緒伺服器實作

Socket 是網路通訊的基石。本文系統介紹 Java Socket 程式設計,涵蓋 TCP/UDP 協定差異、客戶端/伺服端架構、多執行緒併發處理與完整程式碼範例。

網路應用架構模式

模式特點典型應用
主機/終端集中運算、管理大型主機系統
客戶端/伺服器 (C/S)分散式運算、雙向通訊資料庫、即時通訊
瀏覽器/伺服器 (B/S)跨平台、零安裝Web 應用

Socket 核心概念

  • IP 位址:識別網路上的主機
  • 連接埠:識別主機上的進程(0-1023 系統保留,1024-65535 應用使用)
  • Socket:IP + Port 的組合,通訊端點

Java Socket 類別體系

  • java.net.Socket:客戶端 Socket,發起連線
  • java.net.ServerSocket:伺服端 Socket,監聽連線請求
  • java.net.DatagramSocket:UDP 無連線通訊

TCP 流式 Socket 通訊流程


// 客戶端
Socket socket = new Socket("伺服器IP", 連接埠);
OutputStream out = socket.getOutputStream();  // 發送資料
InputStream in = socket.getInputStream();     // 接收資料
// ... 讀寫操作 ...
socket.close();

// 伺服端
ServerSocket server = new ServerSocket(連接埠);
while (true) {
    Socket client = server.accept();  // 阻塞等待連線
    // 處理客戶請求(建議開啟新執行緒)
    client.close();
}
server.close();

完整範例:多執行緒回聲伺服器

伺服端

public class EchoServer {
    private static final int PORT = 8888;
    private static ExecutorService pool = Executors.newCachedThreadPool();

    public static void main(String[] args) throws IOException {
        try (ServerSocket server = new ServerSocket(PORT)) {
            System.out.println("伺服器啟動,監聽埠口: " + PORT);
            while (true) {
                Socket client = server.accept();
                pool.execute(new ClientHandler(client));
            }
        }
    }

    static class ClientHandler implements Runnable {
        private Socket socket;
        ClientHandler(Socket socket) { this.socket = socket; }

        @Override
        public void run() {
            try (BufferedReader in = new BufferedReader(
                    new InputStreamReader(socket.getInputStream(), "UTF-8"));
                 PrintWriter out = new PrintWriter(
                    new OutputStreamWriter(socket.getOutputStream(), "UTF-8"), true)) {
                
                String msg;
                while ((msg = in.readLine()) != null) {
                    System.out.println("收到: " + msg);
                    if ("bye".equalsIgnoreCase(msg)) break;
                    out.println("Echo: " + msg);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try { socket.close(); } catch (IOException ignored) {}
            }
        }
    }
}

客戶端

public class EchoClient {
    public static void main(String[] args) throws IOException {
        try (Socket socket = new Socket("localhost", 8888);
             BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream(), "UTF-8"));
             PrintWriter out = new PrintWriter(
                new OutputStreamWriter(socket.getOutputStream(), "UTF-8"), true);
             BufferedReader console = new BufferedReader(
                new InputStreamReader(System.in))) {
            
            String input;
            while ((input = console.readLine()) != null) {
                out.println(input);
                String response = in.readLine();
                System.out.println("伺服器回應: " + response);
                if ("bye".equalsIgnoreCase(input)) break;
            }
        }
    }
}

UDP 無連線通訊

適用於即時性要求高、可容忍封包遺失的場景(如視訊串流、DNS 查詢):


// 發送端
DatagramSocket socket = new DatagramSocket();
byte[] data = "Hello UDP".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 9999);
socket.send(packet);

// 接收端
DatagramSocket server = new DatagramSocket(9999);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
server.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());

關鍵最佳實踐

  1. 串流包裝:使用 BufferedReader/PrintWriter 處理文字,DataInputStream/DataOutputStream 處理二進制
  2. 編碼一致:雙端統一指定 UTF-8 避免亂碼
  3. 資源管理:使用 try-with-resources 確保 Socket 與串流關閉
  4. 執行緒池:伺服端使用 ExecutorService 避免頻繁建立/銷毀執行緒
  5. 逾時設定:socket.setSoTimeout(毫秒) 防止讀取無限阻塞
  6. 心跳機制:長連線需定期發送心跳檢測連線存活

進階延伸

  • NIO 非阻塞 I/O (java.nio.channels)
  • Netty 等高效能網路框架
  • SSL/TLS 加密通訊 (SSLSocket)
  • WebSocket 全雙工通訊
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved