4.5 Java之網路程式設計
阿新 • • 發佈:2019-01-11
文章目錄
概述
-
實現網路通訊,要滿足兩個要素
- 定位網路主機(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