Java TCP通信

一、TCP協議簡介

TCP(傳輸控制協議)是一種可靠的、基於連接的協議,它在傳輸數據時能夠保證數據的可靠性和有序性。在TCP協議中,通信兩端通過三次握手建立連接,傳輸數據時可靠地分段傳輸,並通過確認、重傳等機制保證數據的可靠性和有序性。

相對於UDP協議,TCP協議的優點是可靠,缺點是效率較低。因此在需要傳輸可靠性高的數據時,一般使用TCP協議。

二、Java TCP通信的實現

Java提供了Socket和ServerSocket兩個類來實現TCP通信。其中Socket類用於與遠程主機建立連接,而ServerSocket類用於監聽端口,並等待客戶端連接。

三、TCP客戶端的實現

以下是一個TCP客戶端的基本實現代碼:

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

public class TCPClient {
    public static void main(String[] args) throws IOException {
        String hostName = "localhost"; // 服務端主機名或IP地址
        int port = 1234; // 服務端監聽端口

        try (
            Socket socket = new Socket(hostName, port);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        ) {
            BufferedReader stdIn =
                new BufferedReader(new InputStreamReader(System.in));
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("服務器回復:" + in.readLine());
            }
        } catch (UnknownHostException e) {
            System.err.println("無法連接到主機:" + hostName);
            System.exit(1);
        } catch (IOException e) {
            System.err.println("無法獲取I/O連接:" + hostName);
            System.exit(1);
        }
    }
}

客戶端通過創建一個Socket連接到服務端,並通過輸入輸出流傳輸數據。其中,Socket的構造函數參數為服務端的主機名和監聽端口。使用PrintWriter向服務端輸出數據,並使用BufferedReader從服務端接收響應數據。

四、TCP服務端的實現

以下是一個TCP服務端的基本實現代碼:

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

public class TCPServer {
    public static void main(String[] args) throws IOException {
        int port = 1234; // 監聽端口

        try (ServerSocket serverSocket = new ServerSocket(port)) { 
            System.out.println("服務器正在監聽端口:" + port);
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("客戶端連接成功,客戶端IP地址:" + socket.getInetAddress());
                new ClientThread(socket).start();
            }
        } catch (IOException e) {
            System.err.println("無法監聽端口:" + port);
            System.exit(1);
        }
    }
}

class ClientThread extends Thread {
    private Socket socket;

    public ClientThread(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        try (
            PrintWriter out =
                new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        ) {
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("客戶端:" + socket.getInetAddress() + "輸入:" + inputLine);
                out.println("服務端回復:" + inputLine);
            }
            System.out.println("客戶端斷開連接");
        } catch (IOException e) {
            e.printStackTrace(); 
        }
    }
}

服務端通過使用ServerSocket監聽指定端口,並等待客戶端連接。一旦客戶端連接成功,服務端會創建一個ClientThread線程來處理客戶端的請求。ClientThread中,使用輸入輸出流與客戶端進行通信。其中, PrintWriter對象用於向客戶端輸出數據,BufferedReader對象用於從客戶端接收數據。

五、小結

通過Java的Socket和ServerSocket類,我們可以很方便地實現TCP通信。在實現TCP通信時,需要注意建立連接的順序,以及數據傳輸的可靠性。同時,我們還可以使用多線程來處理多個客戶端的請求,從而實現一個支持多客戶端的TCP服務器。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/198684.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-04 10:27
下一篇 2024-12-04 10:27

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論