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

Java Socket 網絡編程入門:從模型到完整通訊示例

     編輯:Java 相關知識

網絡編程核心模型:Client-Server

本質是兩個進程通訊:Server 綁定固定 IP+Port 監聽,Client 主動連接。Java 在 java.net 包提供 ServerSocket 和 Socket 實現該模型。

關鍵類與方法

類關鍵方法說明
ServerSocketaccept()阻塞等待客戶端連接,返回新 Socket 處理該連接
SocketgetInputStream(), getOutputStream()獲取字節流,通常包裝為 BufferedReader/PrintWriter 處理文本
InetAddressgetLocalHost(), getByName(host)IP 地址解析

端口選擇規範

  • 範圍:0–65535
  • 0–1023 為系統保留(需特權)
  • 應用層建議使用 1024–49151(已登記)或 49152–65535(動態/私有)

完整示例:回聲服務器與客戶端

Server 端

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

public class EchoServer {
    public static void main(String[] args) throws IOException {
        try (ServerSocket server = new ServerSocket(5678)) {
            System.out.println("Server 啟動,監聽 5678...");
            while (true) {
                try (Socket client = server.accept();
                     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
                     PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"), true)) {
                    String line;
                    while ((line = in.readLine()) != null) {
                        System.out.println("收到: " + line);
                        out.println("Echo: " + line);
                        if ("end".equalsIgnoreCase(line)) break;
                    }
                }
            }
        }
    }
}

Client 端

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

public class EchoClient {
    public static void main(String[] args) throws Exception {
        try (Socket socket = new Socket(InetAddress.getLocalHost(), 5678);
             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))) {
            System.out.println("已連接,輸入 'end' 退出");
            String line;
            while ((line = console.readLine()) != null) {
                out.println(line);
                System.out.println("服務端回覆: " + in.readLine());
                if ("end".equalsIgnoreCase(line)) break;
            }
        }
    }
}

進階必知點

  • 多線程/IO 多路復用:單線程 accept() 循環只能串行處理,生產環境需線程池或 NIO (Selector)
  • 協議設計:文本行協議簡單但低效,二進制協議(Protobuf、Avro)或 HTTP/WebSocket 更通用
  • 超時與心跳:socket.setSoTimeout(ms) 防止讀阻塞永久等待;長連接需應用層心跳檢測存活
  • 資源關閉:使用 try-with-resources 確保流與 Socket 正確關閉,避免句柄洩漏
  • 安全性:生產環境必須使用 SSL/TLS (SSLSocket/SSLServerSocket) 加密傳輸
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved