暑期自學 Day 06 | 網路程式設計(一)

Borris發表於2020-05-12

網路通訊協議

TCP/IP 協議
  • 將網路傳輸分為四層模型:
    • 應用層:規定應用之間傳輸的格式,HTTP,FTP 協議等
    • 傳輸層:將資料傳輸到網路層,TCP,UDP
    • 網路層:核心,將傳輸資料分組,傳輸到接收端,IP 協議
    • 鏈路層:對網路連線裝置的驅動協議,光纖,網線
UDP (User Datagram Protocol) 使用者資料包協議
  • 無連線通訊協議,接收端傳送端不用建立連線
  • 耗資小,傳輸效率高:影片直播…
  • 偶爾丟包,但無太大影響
  • 不對報文進行重組,分片,所以需要注意資料大小,資料大小限制在 64KB 以內
  • 網路包中頭部有8個位元組
TCP (Transmission Control Protocol) 傳輸控制協議
  • 需要客戶端和伺服器透過三次握手建立連線
    • 第一次握手:客戶端向伺服器傳送連線請求,等待伺服器確認
    • 第二次握手:伺服器給客戶端響應,通知其收到了連線請求
    • 第三次握手:客戶端再次傳送確認資訊,確認連線
  • 有確認機制,丟包可以重發
  • 可以對大資料拆分,客戶端進行重組
  • 網路包中頭部有32位元組
IP地址
  • 網路中計算機裝置的唯一編號
  • IPv4:32位二進位制,4個位元組
  • IPv6:128位二進位制,8組16進位制數
埠號
  • 兩個位元組組成,在 0~65535之間,1024前的埠號已經被系統分配完成,無法使用
  • 每個軟體有隨機分配的單獨埠號,無法重複
  • 保證資料準確無誤傳輸到對方計算機指定軟體上
  • 常用埠號
    • 80:網路埠號
    • 3306:mysql 埠號;1521:oracle 埠號
    • 8080:Tomcat 埠號

伺服器端和客戶端的互動

  • 根據網路通訊協議,透過三次握手進行連線
  • 在 Java 中透過 IO 流來傳輸資料
  • 伺服器本身沒有 IO 流物件,透過 accept() 方法獲取客戶端的 IO 流物件和該客戶端進行互動
  • Java 中為了建立 TCP 通訊,為客戶端提供了 Socket 類,為伺服器提供了 ServerSocket 類
Socket 和 Server Socket
  • 伺服器端

    • ServerSocket(int port) 繫結到指定埠號
    • 使用 accept() 獲取請求的客戶端物件
    • 使用步驟:
      • 建立 ServerSocket 物件和系統指定埠號
      • 使用 accept() 獲取請求的客戶端物件 Socket
      • 使用 getInputStream() 獲取客戶端的位元組輸入流物件
      • 使用 InputStream 中的 read,讀取客戶端傳送的資料
      • 使用 getOutputStream()獲取客戶端位元組輸出流物件
      • 使用 OutputStream 中的 write,給客戶端寫回資料
      • 釋放資源
  • 客戶端

    • Socket(String host, int port) 指定 IP 地址和埠
    • 使用步驟和伺服器端基本相同,要透過 Socket 的 getInputStream(),getOnputStream() 方法獲取位元組輸入輸出流
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章