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

JavaSE TCP 網絡編程實戰:ServerSocket 與 Socket 完整指南

     編輯:Java 綜合教學

JavaSE TCP 網絡編程實戰:ServerSocket 與 Socket 完整指南

TCP 協議提供可靠的字節流傳輸服務,Java 通過 ServerSocket(服務端)和 Socket(客戶端)實現網絡通信。本文詳細解析核心 API、構造方法、常用操作,並提供可運行的完整代碼示例。

服務端:ServerSocket 核心解析

ServerSocket 監聽指定端口,等待客戶端連接請求。主要構造方法:

  • ServerSocket():創建非綁定套接字
  • ServerSocket(int port):綁定指定端口
  • ServerSocket(int port, int backlog):指定端口和連接隊列長度
  • ServerSocket(int port, int backlog, InetAddress bindAddr):綁定特定 IP 地址

核心方法 accept() 會阻塞直到有客戶端連接,返回用於通信的 Socket 對象。其他常用方法:bind()、close()、getInetAddress()、isBound()、isClosed()。

客戶端:Socket 核心解析

Socket 代表通信端點。常用構造方法:

  • Socket(String host, int port):連接指定主機和端口(最常用)
  • Socket(InetAddress address, int port):使用 InetAddress 對象
  • Socket():創建未連接套接字,後續調用 connect()

核心方法:connect() 發起連接、close() 關閉連接、getInputStream()/getOutputStream() 獲取流進行數據交換。

完整代碼示例

服務端(支持多客戶端循環)

package network;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try (ServerSocket server = new ServerSocket(9657)) {
            System.out.println("服務端啟動,監聽端口 9657...");
            while (true) {  // 循環接受多個客戶端
                Socket client = server.accept();
                System.out.println("客戶端連接:" + client.getInetAddress());
                // 實際項目中應交給線程池處理
                new Thread(() -> handleClient(client)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void handleClient(Socket client) {
        try (client) {
            // 讀寫邏輯...
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客戶端

package network;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) {
        try (Socket client = new Socket("127.0.0.1", 9657)) {
            System.out.println("已連接到服務端");
            // 發送/接收數據邏輯...
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

常見問題與優化

  • 單線程阻塞:原示例無 while 循環,只能處理一個客戶端。生產環境必須使用線程池或 NIO 非阻塞模型
  • 端口查看:Windows 下 netstat -an 查看端口佔用,ipconfig/all 查看 IP 配置
  • 資源釋放:使用 try-with-resources 確保 Socket 和流正確關閉

總結

掌握 ServerSocket/Socket API 是 Java 網絡編程的基石。實際項目中建議使用 Netty 等高性能網絡框架,但在理解底層原理時,原生 API 學習不可或缺。

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