Java學習日誌(二十三): 網絡編程,TCP通信程序(Socket)

JavaEE學習日誌持續更新----> 必看!JavaEE學習路線(文章總彙)

網絡編程

軟件結構

C/S結構 :全稱爲Client/Server結構,是指客戶端和服務器結構。常見程序有QQ、迅雷等軟件。
在這裏插入圖片描述
B/S結構 :全稱爲Browser/Server結構,是指瀏覽器和服務器結構。常見瀏覽器有谷歌、火狐等。

在這裏插入圖片描述

網絡編程三要素

協議

網絡通信協議:通信協議是對計算機必須遵守的規則,只有遵守這些規則,計算機之間才能進行通信。這就 好比在道路中行駛的汽車一定要遵守交通規則一樣,協議中對數據的傳輸格式、傳輸速率、傳輸步驟等做了 統一規定,通信雙方必須同時遵守,最終完成數據交換。

TCP/IP協議: 傳輸控制協議/因特網互聯協議( Transmission Control Protocol/Internet Protocol),是 Internet最基本、最廣泛的協議。它定義了計算機如何連入因特網,以及數據如何在它們之間傳輸的標準。它 的內部包含一系列的用於處理數據通信的協議,並採用了4層的分層模型,每一層都呼叫它的下一層所提供的 協議來完成自己的需求。

在這裏插入圖片描述
TCP:傳輸控制協議 (Transmission Control Protocol)。TCP協議是面向連接的通信協議,即傳輸數據之前, 在發送端和接收端建立邏輯連接,然後再傳輸數據,它提供了兩臺計算機之間可靠無差錯的數據傳輸。
三次握手:TCP協議中,在發送數據的準備階段,客戶端與服務器之間的三次交互,以保證連接的可 靠。
第一次握手,客戶端向服務器端發出連接請求,等待服務器確認。
第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了連接請求。
第三次握手,客戶端再次向服務器端發送確認信息,確認連接。整個交互過程如下圖所示。
在這裏插入圖片描述

完成三次握手,連接建立後,客戶端和服務器就可以開始進行數據傳輸了。由於這種面向連接的特性,TCP協議可 以保證傳輸數據的安全,所以應用十分廣泛,例如下載文件、瀏覽網頁等。

IP地址

IP地址:指互聯網協議地址(Internet Protocol Address),俗稱IP。IP地址用來給一個網絡中的計算機設 備做唯一的編號。假如我們把“個人電腦”比作“一臺電話”的話,那麼“IP地址”就相當於“電話號碼”。

IP地址分類

  • IPv4:是一個32位的二進制數,通常被分爲4個字節,表示成 a.b.c.d 的形式,例如 192.168.65.100 。其 中a、b、c、d都是0~255之間的十進制整數,那麼最多可以表示42億個。
  • IPv6:由於互聯網的蓬勃發展,IP地址的需求量愈來愈大,但是網絡地址資源有限,使得IP的分配越發緊張。 有資料顯示,全球IPv4地址在2011年2月分配完畢。 爲了擴大地址空間,擬通過IPv6重新定義地址空間,採用128位地址長度,每16個字節一組,分成8組十六進 制數,表示成 ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 ,號稱可以爲全世界的每一粒沙子編上一個網 址,這樣就解決了網絡地址資源數量不夠的問題。

常用命令:

  • 查看本機地址

      ipconfig
    
  • 檢查網絡是否連通

      ping 空格 IP地址 
      ping 220.181.57.216 
      ping www.baidu.com
    
  • 特殊的IP地址

      本機IP地址: 127.0.0.1 、 localhost 
    

端口號

在這裏插入圖片描述

TCP通信程序(Socket)

TCP通信程序概述

TCP通信能實現兩臺計算機之間的數據交互,通信的兩端,要嚴格區分爲客戶端(Client)與服務端(Server)。
兩端通信時步驟:

  1. 服務端程序,需要事先啓動,等待客戶端的連接。
  2. 客戶端主動連接服務器端,連接成功才能通信。服務端不可以主動連接客戶端。

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

  1. 客戶端java.net.Socket 類表示。創建 Socket 對象,向服務端發出連接請求,服務端響應請求,兩者建 立連接開始通信。
  2. 服務端java.net.ServerSocket 類表示。創建 ServerSocket 對象,相當於開啓一個服務,並等待客戶端 的連接。

TCP通信的原理

在這裏插入圖片描述

TCP通信的客戶端程序

TCP通信的客戶端程序:向服務器發送請求連接,和服務器經過三次握手建立邏輯連接;客戶端可以給服務器發送數據,讀取服務器回寫的數據。
表示客戶端的類
java.net.Socket:該類實現客戶端套接字(也稱爲“套接字”)。 套接字是兩臺機器之間通信的端點。
套接字:封裝了IP地址和端口的網絡軟件

構造方法
Socket​(String host, int port) 創建流套接字並將其連接到指定主機上的指定端口號。
參數

    String host:主機名稱/IP地址 表示本機IP:127.0.0.1/localhost
    int port:端口號

成員方法
OutputStream getOutputStream() 返回此套接字的輸出流。
InputStream getInputStream() 返回此套接字的輸入流。

實現步驟

  1. 創建客戶端Socket對象,構造方法封裝服務器的IP地址和端口號
  2. 使用Socket對象中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象
  3. 使用網絡字節輸出流OutputStream對象中的方法write,給服務器發送數據
  4. 使用Socket對象中的方法getInputStream,獲取網絡字節輸入流InputStream對象
  5. 使用網絡字節輸入流InputStream對象中的方法read,讀取服務器回寫的數據
  6. 釋放資源(關閉socket)

注意:

  1. 在創建客戶端對象Socket的時候,向服務器發送請求連接,和服務器經過三次握手建立邏輯連接
    服務器已經啓動,那麼客戶端就可以給服務器發送數據
    服務器沒有啓動,客戶端就會拋出連接異常java.net.ConnectException: Connection refused: connect
  2. 客戶端和服務器之間進行交互,必須使用Socket中提供的網絡流,不能用自己創建的流

代碼示例:客戶端程序

public class TCPClient {
    public static void main(String[] args) throws IOException {
        //1.創建客戶端Socket對象,構造方法封裝服務器的IP地址和端口號
        Socket socket = new Socket("127.0.0.1",8888);
        //2.使用Socket對象中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象
        OutputStream os = socket.getOutputStream();
        //3.使用網絡字節輸出流OutputStream對象中的方法write,給服務器發送數據
        os.write("你好服務器".getBytes());
        //4.使用Socket對象中的方法getInputStream,獲取網絡字節輸入流InputStream對象
        InputStream is = socket.getInputStream();
        //5.使用網絡字節輸入流InputStream對象中的方法read,讀取服務器回寫的數據
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //6.釋放資源(關閉socket)
        socket.close();
    }
}

TCP通信的服務器端程序

TCP通信的服務器端程序:接收客戶端的請求和客戶端建立邏輯連接;接收客戶端發送的數據,給客戶端回寫數據
表示服務器的類
java.net.ServerSocket:該類實現服務器套接字
構造方法
ServerSocket​(int port) 創建綁定到指定端口的服務器套接字。

服務器有一件特別重要的事情,必須明確是哪個客戶端請求的服務器
在服務器有一個成員方法,叫accept可以監聽並獲取到請求的客戶端Socket對象
Socket accept() 偵聽對此套接字的連接並接受它。
一直等待客戶端的連接,有客戶端請求,就會獲取到客戶端

實現步驟

  1. 創建服務器ServerSocket對象,構造方法和系統要指定的端口號
  2. 使用ServerSocket對象中的方法accept,監聽並獲取到請求的客戶端Socket對象
  3. 使用Socket對象中的方法getInputStream,獲取網絡字節輸入流InputStream對象
  4. 使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端發送的數據
  5. 使用Socket對象中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象
  6. 使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫數據
  7. 釋放資源(Socket,ServerSocket)

代碼實現:服務器端程序

public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1.創建服務器ServerSocket對象,構造方法和系統要指定的端口號
        ServerSocket server = new ServerSocket(8888);
        //2.使用ServerSocket對象中的方法accept,監聽並獲取到請求的客戶端Socket對象
        Socket socket = server.accept();
        //3.使用Socket對象中的方法getInputStream,獲取網絡字節輸入流InputStream對象
        InputStream is = socket.getInputStream();
        //4.使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端發送的數據
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //5.使用Socket對象中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象
        OutputStream os = socket.getOutputStream();
        //6.使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫數據
        os.write("收到,謝謝".getBytes());
        //7.釋放資源(Socket,ServerSocket)
        socket.close();
        server.close();

    }
}

輸出結果:
客戶端啓動之後,客戶端發送數據
在這裏插入圖片描述
服務器端收到數據後,返回信息
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章