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

Java Socket程式設計:TCP/UDP雙模式完整實戰指南

     編輯:Java 程式設計入門

兩種傳輸模式對比

特性面向連線無連線
協議TCPUDP
比喻電話通話郵件投遞
連線建立三向交握無需連線
可靠性有序、不丟失、無重複不保證到達/順序/完整
效率較低(握手、確認、重傳)高(無連線開銷)
適用場景檔案傳輸、資料庫、郵件串流媒體、遊戲、DNS、日誌
Java類別Socket / ServerSocketDatagramSocket / DatagramPacket

TCP Socket程式設計

客戶端

public class TcpClient {
    public static void main(String[] args) throws IOException {
        try (Socket socket = new Socket("localhost", 8888);
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(
                 new InputStreamReader(socket.getInputStream()))) {
            
            out.println("GET / HTTP/1.1");
            out.println("Host: localhost");
            out.println();
            
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
        }
    }
}

伺服器端

public class TcpServer {
    public static void main(String[] args) throws IOException {
        try (ServerSocket serverSocket = new ServerSocket(8888)) {
            System.out.println("伺服器啟動,等待連線...");
            while (true) {
                Socket clientSocket = serverSocket.accept();
                new Thread(() -> handleClient(clientSocket)).start();
            }
        }
    }
    
    private static void handleClient(Socket socket) {
        try (BufferedReader in = new BufferedReader(
                 new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
            
            String requestLine = in.readLine();
            System.out.println("收到請求:" + requestLine);
            out.println("HTTP/1.1 200 OK");
            out.println("Content-Type: text/plain");
            out.println();
            out.println("Hello from TCP Server!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UDP Datagram程式設計

客戶端

try (DatagramSocket socket = new DatagramSocket()) {
    byte[] sendData = "TIME_REQUEST".getBytes();
    DatagramPacket sendPacket = new DatagramPacket(
        sendData, sendData.length, InetAddress.getByName("localhost"), 9999);
    socket.send(sendPacket);
    
    byte[] receiveData = new byte[1024];
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    socket.receive(receivePacket);
    System.out.println("回應:" + new String(receivePacket.getData(), 0, receivePacket.getLength()));
}

伺服器端

try (DatagramSocket socket = new DatagramSocket(9999)) {
    byte[] buffer = new byte[1024];
    while (true) {
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        socket.receive(packet);
        String request = new String(packet.getData(), 0, packet.getLength());
        String response = new Date().toString();
        byte[] respData = response.getBytes();
        DatagramPacket respPacket = new DatagramPacket(
            respData, respData.length, packet.getAddress(), packet.getPort());
        socket.send(respPacket);
    }
}

選型決策指南

  • 資料完整性至上 → TCP
  • 即時性優於可靠性 → UDP
  • 需流控、擁塞控制 → TCP
  • 廣播/多播需求 → UDP
  • NAT穿透場景 → UDP配合STUN/TURN

現代高效能網路程式常採用NIO(Selector、SocketChannel)實現非阻塞IO,單執行緒處理萬級連線,這是進階學習方向。

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