Java實現TCP通訊程式

hellosc01發表於2020-11-07

1 概述

TCP通訊能實現兩臺計算機之間的資料互動,通訊的兩端,要嚴格區分為客戶端(Client)與服務端(Server)。

兩端通訊時步驟:

  1. 服務端程式先啟動,等待客戶端的連線。
  2. 客戶端請求連線服務端,連線成功才能通訊。服務端不可以主動連線客戶端。

在Java中,提供了兩個類用於實現TCP通訊程式:

  1. 服務端:java.net.ServerSocket 類。建立ServerSocket物件,相當於開啟一個服務,並等待客戶端的連線。
  2. 客戶端:java.net.Socket 類。建立Socket物件,向服務端發出連線請求,服務端響應請求,兩者建立連線,開始通訊。

2 ServerSocket類(服務端)

ServerSocket類:實現了伺服器套接字,該類物件等待通過網路的請求。

套接字指的是兩臺裝置之間通訊的端點。

2.1 構造方法

  • public ServerSocket(int port) :建立一個ServerSocket物件,並將其繫結到一個指定的埠號上,引數port就是埠號。

構造舉例,程式碼如下:

ServerSocket server = new ServerSocket(6666);

2.2 成員方法

  • public Socket accept() :偵聽並接受連線,返回一個新的Socket物件,用於和客戶端實現通訊。該方法會一直阻塞直到建立連線。

3 Socket類(客戶端)

Socket 類:該類實現客戶端套接字。

3.1 構造方法

  • public Socket(String host, int port) :建立套接字物件並將其連線到指定主機上的指定埠號。
    如果指定的host是null ,則相當於指定地址為回送地址。

    小貼士:回送地址(127.x.x.x) 是本機回送地址(Loopback Address),主要用於網路軟體測試以及本地機程式間通訊,無論什麼程式,一旦使用回送地址傳送資料,立即返回,不進行任何網路傳輸。

構造舉例,程式碼如下:

Socket client = new Socket("127.0.0.1", 6666);

3.2 成員方法

1 public InputStream getInputStream() : 返回此套接字的輸入流。

  • 如果此Scoket具有相關聯的通道,則生成的InputStream 的所有操作也關聯該通道。
  • 關閉生成的InputStream也將關閉相關的Socket。

2 public OutputStream getOutputStream() : 返回此套接字的輸出流。

  • 如果此Scoket具有相關聯的通道,則生成的OutputStream 的所有操作也關聯該通道。
  • 關閉生成的OutputStream也將關閉相關的Socket。

3 public void close() :關閉此套接字。

  • 一旦一個socket被關閉,它不可再使用。
  • 關閉此socket也將關閉相關的InputStream和OutputStream 。

4 public void shutdownOutput() : 禁用此套接字的輸出流。

  • 任何先前寫出的資料將被髮送,隨後終止輸出流。

4 簡單的TCP通訊程式

4.1 TCP通訊步驟解析

  1. 【服務端】啟動,建立ServerSocket物件,等待連線。
  2. 【客戶端】啟動,建立Socket物件,請求連線。
  3. 【服務端】接收連線,呼叫accept方法,並返回一個Socket物件。
  4. 【客戶端】Socket物件獲取OutputStream,向服務端寫出資料。
  5. 【服務端】Scoket物件獲取InputStream,讀取客戶端傳送的資料。

到此,客戶端向服務端傳送資料成功。


自此,服務端向客戶端回寫資料。

  1. 【服務端】Socket物件,獲取OutputStream,向客戶端回寫資料。
  2. 【客戶端】Scoket物件,獲取InputStream,解析回寫資料。
  3. 【客戶端】釋放資源,斷開連線。

在這裡插入圖片描述

4.2 客戶端向伺服器傳送資料

服務端實現:

public class ServerTCP {
    public static void main(String[] args) throws IOException {
        System.out.println("服務端啟動 , 等待連線 .... ");
        // 1.建立 ServerSocket物件,繫結埠,開始等待連線
        ServerSocket ss = new ServerSocket(6666);
        // 2.接收連線 accept 方法, 返回 socket 物件.
        Socket server = ss.accept();
        // 3.通過socket 獲取輸入流
        InputStream is = server.getInputStream();
        // 4.一次性讀取資料
      	// 4.1 建立位元組陣列
        byte[] b = new byte[1024];
      	// 4.2 據讀取到位元組陣列中.
        int len = is.read(b);
        // 4.3 解析陣列,列印字串資訊
        String msg = new String(b, 0, len);
        System.out.println(msg);
        //5.關閉資源.
        is.close();
        server.close();
    }
}

客戶端實現:

public class ClientTCP {
	public static void main(String[] args) throws Exception {
		System.out.println("客戶端 傳送資料");
		// 1.建立 Socket ( ip , port ) , 確定連線到哪裡.
		Socket client = new Socket("localhost", 6666);
		// 2.獲取流物件 . 輸出流
		OutputStream os = client.getOutputStream();
		// 3.寫出資料.
		os.write("你好麼? tcp ,我來了".getBytes());
		// 4. 關閉資源
		os.close();
		client.close();
	}
}

在這裡插入圖片描述
在這裡插入圖片描述

4.3 伺服器向客戶端回寫資料

服務端實現:

public class ServerTCP {
    public static void main(String[] args) throws IOException {
        System.out.println("服務端啟動 , 等待連線 .... ");
        // 1.建立 ServerSocket物件,繫結埠,開始等待連線
        ServerSocket ss = new ServerSocket(6666);
        // 2.接收連線 accept 方法, 返回 socket 物件.
        Socket server = ss.accept();
        // 3.通過socket 獲取輸入流
        InputStream is = server.getInputStream();
        // 4.一次性讀取資料
      	// 4.1 建立位元組陣列
        byte[] b = new byte[1024];
      	// 4.2 據讀取到位元組陣列中.
        int len = is.read(b);
        // 4.3 解析陣列,列印字串資訊
        String msg = new String(b, 0, len);
        System.out.println(msg);
      	// =================回寫資料=======================
      	// 5. 通過 socket 獲取輸出流
      	 OutputStream out = server.getOutputStream();
      	// 6. 回寫資料
      	 out.write("我很好,謝謝你".getBytes());
      	// 7.關閉資源.
      	out.close();
        is.close();
        server.close();
    }
}

客戶端實現:

public class ClientTCP {
	public static void main(String[] args) throws Exception {
		System.out.println("客戶端 傳送資料");
		// 1.建立 Socket ( ip , port ) , 確定連線到哪裡.
		Socket client = new Socket("localhost", 6666);
		// 2.通過Scoket,獲取輸出流物件 
		OutputStream os = client.getOutputStream();
		// 3.寫出資料.
		os.write("你好麼? tcp ,我來了".getBytes());
      	// ==============解析回寫=========================
      	// 4. 通過Scoket,獲取 輸入流物件
      	InputStream in = client.getInputStream();
      	// 5. 讀取資料資料
      	byte[] b = new byte[100];
      	int len = in.read(b);
      	System.out.println(new String(b, 0, len));
		// 6. 關閉資源 .
      	in.close();
		os.close();
		client.close();
	}
}

在這裡插入圖片描述
在這裡插入圖片描述

相關文章