1. 程式人生 > >《Java TCP/IP Socket程式設計》讀書筆記

《Java TCP/IP Socket程式設計》讀書筆記

第一章:簡介:

這一章的內容是一些基礎知識的概述:

  • 計算機網路的概念,分組報文和協議
    • 乙太網
    • HTTP
    • TCP/IP協議族(UDP)
    • OSI七層網路結構
    • 地址的概念 IPv4(32bit)、IPv6(128bit)
    • DNS的相關概念,地址解析協議
    • C/S模式 客戶端和 伺服器端
    • 套接字的概念(IP地址+PORT埠)
      • 流套接字(stream socket)TCP協議
      • 資料報套接字(datagram socket)UDP協議

第二章:基本套接字

這一章主要介紹了最基本的socket程式設計,採用最初的阻塞方式。主要有幾個Java類的使用要注意。

  • InetAddress網路地址類
    • 獲取InetAddress類例項的方法:
      • getAllByName(String host) 靜態工廠方法獲取網路地址類
      • getByName()
      • getLocalHost()
      • getAddress()
    • 檢測類屬性的相關方法
      • isAnyLocalAddress()
      • isMCGlobal()
      • isReadable()
      • 等等
  • NetWorkInterface類
  • TCP套接字
    • Socket 客戶端建立
    • ServerSocket 伺服器端建立
    • OutputStream 輸出流,利用其向對方傳送資料
    • InputStream 輸入流,讀取對方放過來得資料
  • UDP套接字
    • DatagramPacket類,表示資料報。
    • DatagramSocket類,用來發送DatagramPacket的例項

TCP套接字的建立流程
客戶端:


1. 建立一個Socket例項:建構函式指向的遠端主機和埠建立一個TCP連線。
2. 通過套接字的輸入輸出流(I/O streams)進行通訊:一個Socket連線例項包括一個InputStream和OutputStream。
3. 使用Socket類的close()方法關閉連線。

伺服器端:

  1. 建立一個ServerSocket例項並指定本地埠。
  2. 重複執行:
    1. 呼叫ServerSocket的accept()方法以獲取下一個客戶端連線。基於新建立的客戶端連線,建立一個Socket例項,並由accept()方法返回。
    2. 使用返回的Socket例項的InputStream和OutputStream與客戶端進行通訊。
    3. 通訊完成後,使用Socket類的close()方法關閉該客戶端套接字連線。

第三章:傳送和接收資料:

這一章主要講述了應用程式編碼,因為最初的輸入輸出流只能傳輸位元組碼,像short、int、long等等這些資料型別是傳輸不了的,所以我們要想辦法。

  • 大端模式和小端模式
  • 組合輸入輸出流
  • 成幀與解析(如何定位訊息的首尾位置)
    • 基於定界符
    • 顯式長度
  • 構建和解析協議訊息
    • 基於文字的表示方法(使用ASC碼字符集對文字進行編碼)
    • 二進位制表示方法(自己編碼010101代表一個值)

第四章:進階

這一章主要講述了多執行緒技術來處理多個客戶端請求,並引入了執行緒池的概念,後面也介紹了UDP廣播和多播的內容。

  • Java多執行緒
    • 執行緒池的使用
    • Executor介面
  • 阻塞和超時
    • 限制讀寫的時間
  • 多接受者
    • 廣播
    • 多播
  • 控制預設行為
    • keep-alive機制
    • 傳送噩耗接收快取區的大小
    • 超時的引數設定
    • 地址重用
    • 消除快取延遲
    • 緊急資料(雖然沒什麼用)
    • 關閉後停留
    • 廣播許可
    • 通訊等級
    • 基於效能的協議選擇
  • 關閉連線(多種方法)
    • close()
    • shutdownOutput
    • shutdownInput

第五章:NIO

  • buffer 緩衝區,底層為後援儲存空間,與channel進行通訊。
    • 索引訪問:
      • capacity 緩衝區中元素總數
      • position 下一個要讀的元素(從0開始)
      • limit 第一個不可讀的元素
      • mark 使用者選定的position的前一個位置
    • 儲存和接受資料的方法:
      • get() -會丟擲BufferUnderflowException異常
      • put() -會丟擲IndexOutOfBoundsException異常
    • 多位元組資料在位元組陣列中的儲存方式:Java預設大端模式
      • BIG_ENDING
      • LITTLE_ENDING
    • 部分函式:調整position、limit的值
      • clear()
      • flip()
      • rewind() 通常用在日誌的寫入
    • buffer壓縮
      • compact()用於節省緩衝區的空間
    • buffer透視
      • duplicate()
      • slice()
    • 位元組編碼
  • channel 通道, 類似於 socket。
    • channel種類,有兩個變體:
      • SocketChannel 相當於客戶端
      • ServerSocketChannel 相當於伺服器端
    • 通道的建立、連線和關閉
      • open()
      • connect()
      • isConnect()
      • close()
      • isOpen()
      • socket() 對包含的Socket進行訪問
    • SocketChannel的讀和寫
      • read() 包含多種引數的過載方法
      • write() 包含多種引數的過載方法
  • Selecttor 管理檢查多個通道的I/O。
    • selector需要在通道(channel)上註冊,selector跟channel之間的關聯由一個SelectorKey例項表示。
    • SelectorKey類中的常量定義了通道上感興趣的操作型別,存放在bitmap(點陣圖)中。
    • 相關方法:
      • select()
      • wakeup()
      • selectNow()
      • keys()返回所有已註冊的鍵
      • selectedKeys() 上次呼叫被選中,並已準備好進行I/O操作的鍵

最後來一個Selector的小結:
Selector的使用步驟

  1. 建立一個Selector例項。
  2. 將其註冊到各種通道,指定每一個通道上感興趣的I/O操作。
  3. 重複執行:
    1. 呼叫一種select方法
    2. 獲取選取的鍵列表
    3. 對於已選鍵集中的每一個鍵
      1. 獲取通道,並從鍵中獲取附件
      2. 確定準備就緒的操作並執行。如果是accept操作,將接受的通道設定為非阻塞模式,並將其與選擇器註冊。
      3. 如果需要,修改鍵的興趣操作集。
      4. 從已選鍵中移除鍵。

第六章:深入剖析

對socket和serversocket例項的底層細節進行的介紹。

  • 不能假設在連結一端將資料寫入輸出流和另一端從輸入流讀出資料之間有任何一致性。
  • TCP連線上會被分成3個FIFO佇列
    • SendQ
    • RecvQ
    • Delivered
  • 死鎖風險
  • TCP套接字的生存週期
    • 三次握手建立連線
    • 四次揮手關閉連線