1. 程式人生 > >4.5 Java之網路程式設計

4.5 Java之網路程式設計

文章目錄

概述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

  • 實現網路通訊,要滿足兩個要素

    • 定位網路主機(IP地址指明主機,埠號指明應用程式)
    • 通訊方式:按照通訊協議標準實現通訊。根據通訊協議,分為TCP和UDP(以傳輸層叫UDP的形式命名的)
  • URL:統一資源定位符,從地址獲取資源

  • 本章看作I/O章節的拓展,因為可把硬碟檔案看作資源,也可看作網路中對話的內容——》如何在網路中實現I/O(網路程式設計)

  • Java語言可以在瀏覽器端使用,也可以與遠端伺服器端進行互動

  • 網路程式設計主要位於net包下,Java封裝細節,對外提供統一類庫,可實現跨平臺連線

  • 計算機網路:物理計算機通過網路連線來共享資訊

在這裡插入圖片描述

  • OSI模型:網路分為七層,每層有對應協議
  • 關注各層的具體實現(協議)
  • 遠端傳輸協議HTTP,FTP屬於應用層
  • IP協議是網路層的,TCP,UDP是傳輸層的
  • 為什麼要多層傳輸:為了保證傳輸可靠(類比快遞的層層包裝)

在這裡插入圖片描述

  • IP:網際網路的一個協議簡稱
  • 子網掩碼:用於區分IP地址段(如網路段,主機段),子網掩碼又分為A網,B網,C網,255表示C網
  • 本地迴環地址:自己訪問自己時的IP地址

InetAddress

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

  • 上圖為傳入域名的列印結果
  • 該類是表示IP地址的類,該類的一個物件對應一個IP地址
  • 該類的構造器不能直接訪問
  • 通過String型別形參指明該類物件的表示內容(IP地址內容)
  • 可傳入**域名(網站名)**來找到對應的IP地址(前提:聯網)
  • IP地址一一對應域名

在這裡插入圖片描述

  • 上圖為傳入IP地址的列印結果,可見其沒有涉及域名,直接列印IP地址
  • 域名=主機名=hostname

在這裡插入圖片描述

  • 域名內容傳送到DNS(域名解析伺服器)中,解析為對應的IP地址,再反饋回來,再通過IP地址訪問網路伺服器中對應的網站(域名與IP地址一一對應的關係先在本機的hosts檔案中尋找)
  • 實現網路程式設計使用socket類(網路程式設計又稱為socket程式設計)

網路通訊協議概述

在這裡插入圖片描述

  • 網路通訊協議定義通訊方式,即滿足一定的規則,稱為協議
  • TCP協議:傳輸前要完成三次握手(完成握手再傳輸),但程式中不顯式寫出,為了保證連線可靠,特點:可靠
    • 我要傳送
    • 接收
    • 告訴:我接收到你傳送得資訊了,可以開始了
  • UDP協議:封裝成資料包(資料報,有大小限制,每個小包都獨立記錄目標埠號和IP地址,然後瞬間一頓傳送出去),特點:速度快。類比導彈叢集攻擊
  • 伺服器端下載視訊(伺服器端傳送資料到客戶端):視訊傳輸使用UDP(允許丟失資料,視覺暫留現象,而若使用TCP,其因為要保證資料的連續性(不丟失資料),當網路中斷,資料卡住不動,等待資料傳輸,造成視訊卡頓)

Socket類

在這裡插入圖片描述

  • Socket為Java中的類,通訊兩端都要有該類的物件
  • 網路傳輸本質上還是以流的形式進行I/O傳輸,要求兩端以socket實現
  • 網路開發分為C/S架構(客戶端服務端)和B/S架構(瀏覽器是客戶端,伺服器)
    在這裡插入圖片描述
  • 利用Socket類實現TCP或UDP傳輸(網路程式設計=兩端socket間程式設計)
  • AIT+/:提示

TCP例項一(單向)

客戶端

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

  • 以流形式向外傳輸:outputstream(抽象類)
  • 抽象類來接收,不用指明具體實現類,即使強轉也不正確,實際執行時是返回outputstream的子類物件
    在這裡插入圖片描述
  • 不能直接throws因為要保證稀有資源一定關閉

服務端

在這裡插入圖片描述

  • Serversocket構造器只有一個引數,只需要指明自身埠號,因為系統會自動記錄執行程式的主機IP地址
  • 沒法讓ss(Serversocket物件)直接實現接收流,要先accept,返回Socket物件
  • 服務端先建立的是serversocket來返回socket而不是直接建立socket物件
  • 一定是socket來接收

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

  • 從後往前關稀有資源

修改(新的方法)

在這裡插入圖片描述

執行結果

在這裡插入圖片描述

  • 先開服務端,在開客戶端(否則直接連線失敗,停止執行)
  • 點選小電腦圖表切換服務端和客戶端

TCP例項二(雙向)

未處理異常客戶端

在這裡插入圖片描述

  • 缺了個shutdown—方法

未處理異常伺服器端

在這裡插入圖片描述

客戶端

在這裡插入圖片描述

  • 關注shutdownOutput方法的重要性,原因見下
  • 程式流程:客戶端向輸出流寫——》寫完傳送,伺服器端接收(當不新增shutdown方法時,由於read方法是阻塞式方法,伺服器端不知道什麼時候傳送結束,一直接執行read操作)
  • 說到底,本例中還是伺服器端阻塞了(不知道輸入何時結束,PS:對於客戶端是輸出)

在這裡插入圖片描述

  • 幾個異常並列到finally塊中,在每個if塊裡都try/catch了,保證每個流都能關閉

服務端

在這裡插入圖片描述

  • 節點流的read方法是阻塞式方法,緩衝流則不然
  • fileinputstream為基本的節點流,is是輸入流(inputstream為抽象類)的子類物件,類比fileinputstream,其read方法也是阻塞式方法
  • 傳送反饋訊息,還使用那個socket(os = s.getOutputStream())

在這裡插入圖片描述

雖然在大多數的時候可以直接使用Socket類或輸入輸出流的close方法關閉網路連線,但有時我們只希望關閉OutputStream或InputStream,而在關閉輸入輸出流的同時,並不關閉網路連線。這就需要用到Socket類的另外兩個方法:shutdownInput和shutdownOutput,這兩個方法只關閉相應的輸入、輸出流,而它們並沒有同時關閉網路連線的功能。

TCP例項三

在這裡插入圖片描述

客戶端

在這裡插入圖片描述

在這裡插入圖片描述

  • 先從本地讀入,再通過socket寫出去(os.write方法)
  • 一進來,還得讀,然後輸出到控制檯上

服務端

在這裡插入圖片描述

修改

  • 新增紅線程式碼,檢視傳送源

在這裡插入圖片描述

  • 文字處理即字串處理

Tomcat伺服器與瀏覽器

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

  • 瀏覽器作為客戶端,Tomcat伺服器作為服務端
  • 使用瀏覽器訪問伺服器,可讀取其中資源,瀏覽器是訪問網路資源的視窗
  • Tomcat伺服器預設為8080埠
  • 可通過URL存到本地(類比迅雷下載)

  • 客戶端操作資料庫流程:
    在這裡插入圖片描述

  • 通過Internet連線web伺服器,然後web伺服器呼叫相應的應用伺服器,然後獲取資料庫的資訊,然後再反饋回來

TCP例項四

在這裡插入圖片描述

客戶端

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

  • 異常仿前文自行處理
  • scanner也是稀有資源,要關閉
  • if語句保證物件有建立,防止空指標異常
  • 程式流程:獲取輸出流,然後向服務端傳送內容
  • 要向程式寫入資料,考慮使用System.in(預設為鍵盤)
  • 將資料寫入程式然後傳送資料的方式:1.使用I/O流先作個轉換,然後傳送資料 2.使用scanner讀取資料,然後傳送資料
  • 客戶端與服務端說到底仍然通過socket通訊

服務端

在這裡插入圖片描述

  • 服務端獲取輸入流,且要明曉:只要是輸入的,考慮使用位元組陣列來接收(寫入到位元組陣列,最終由string接收)
  • 此處未處理異常,仿照前文
  • 一處修正,不然返回的字串是NULL開頭的
    在這裡插入圖片描述

TCP總結

  • remember網路通訊流程
  • 客戶端傳送完要shutdown,則服務端read解除阻塞狀態,執行下方語句

  • socket:船隻
  • serversocket:港口(用於停泊)
  • accept表示港口可接收船隻,然後等待船隻過來(類似於造了一個船隻,相當於船隻傳送過來)
  • getInput:卸貨

UDP

概述

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

  • 資料報:datagrampacket,不在socket中指明目標地址,而在資料報中指明
  • UDP通訊:接收未開啟,同樣傳送,所以可能會丟失

例項

傳送端

在這裡插入圖片描述

  • 首先建立socket(造船),然後裝貨併發送
  • DatagramPacket的構造器表明:從陣列b的索引0處開始發,發完byte陣列的資料
  • 本質還是通過資料報傳送和接收

接收端

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

  • DatagramPacket的構造器表明:資料報由b來接收,從0開始寫,直到寫完,即定義b.length長度來寫
  • 接收到資料報中,即接收到byte陣列中
    在這裡插入圖片描述

URL程式設計

在這裡插入圖片描述

  • 應用程式下存在的檔名

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

  • 獲取檔案的相對位置=獲取檔案的引用
  • 建立檔案,填入檔案的路徑——》建立URL物件,填入資源的路徑

在這裡插入圖片描述

  • URL類物件對應一網路資源
  • URL類沒有輸出方法,只有輸入方法,要想輸出要使用URLConnection