目錄
前言
第1章 緩衝區的使用 1
1.1 NIO概述 5
1.2 緩衝區介紹 6
1.3 Buffer類的使用 7
1.3.1 包裝數據與獲得容量 7
1.3.2 限製獲取與設置 10
1.3.3 位置獲取與設置 12
1.3.4 剩餘空間大小獲取 13
1.3.5 使用Buffer mark()方法處理標記 14
1.3.6 知識點細化測試 15
1.3.7 判斷隻讀 22
1.3.8 直接緩衝區 22
1.3.9 還原緩衝區的狀態 23
1.3.10 對緩衝區進行反轉 24
1.3.11 判斷是否有底層實現的數組 28
1.3.12 判斷當前位置與限製之間是否有剩餘元素 29
1.3.13 重繞緩衝區 30
1.3.14 獲得偏移量 32
1.3.15 使用List.toArray(T[])轉成數組類型 33
1.4 ByteBuffer類的使用 34
1.4.1 創建堆緩衝區與直接緩衝區 35
1.4.2 直接緩衝區與非直接緩衝區的運行效率比較 37
1.4.3 包裝wrap數據的處理 39
1.4.4 put(byte b)和get()方法的使用與position自增特性 40
1.4.5 put(byte[] src, int offset, int length)和get(byte[] dst, int offset, int length)方法的使用 41
1.4.6 put(byte[] src)和get(byte[] dst)方法的使用 46
1.4.7 put(int index, byte b)和get(int index)方法的使用與position不變 49
1.4.8 put(ByteBuffer src)方法的使用 50
1.4.9 putType()和getType()方法的使用 51
1.4.10 slice()方法的使用與arrayOffSet()為非0的測試 53
1.4.11 轉換為CharBuffer字符緩衝區及中文的處理 54
1.4.12 轉換為其他類型的緩衝區 58
1.4.13 設置與獲得字節順序 63
1.4.14 創建隻讀緩衝區 65
1.4.15 壓縮緩衝區 65
1.4.16 比較緩衝區的內容 66
1.4.17 復製緩衝區 70
1.4.18 對緩衝區進行擴容 72
1.5 CharBuffer類的API使用 73
1.5.1 重載append(char)/append(Char-Sequence)/append(CharSequence, start, end)方法的使用 73
1.5.2 讀取相對於當前位置的給定索引處的字符 74
1.5.3 put(String src)、int read(CharBuffer target)和subSequence(int start, int end)方法的使用 74
1.5.4 static CharBuffer wrap(Char-Sequence csq, int start, int end)方法的使用 76
1.5.5 獲得字符緩衝區的長度 76
1.6 小結 77
第2章 通道和FileChannel類的使用 78
2.1 通道概述 78
2.2 通道接口的層次結構 80
2.2.1 AsynchronousChannel接口的介紹 82
2.2.2 AsynchronousByteChannel接口的介紹 84
2.2.3 ReadableByteChannel接口的介紹 84
2.2.4 ScatteringByteChannel接口的介紹 85
2.2.5 WritableByteChannel接口的介紹 86
2.2.6 GatheringByteChannel接口的介紹 87
2.2.7 ByteChannel接口的介紹 88
2.2.8 SeekableByteChannel接口的介紹 89
2.2.9 NetworkChannel接口的介紹 90
2.2.10 MulticastChannel接口的介紹 91
2.2.11 InterruptibleChannel接口的介紹 92
2.3 AbstractInterruptibleChannel類的介紹 93
2.4 FileChannel類的使用 95
2.4.1 寫操作與位置的使用 97
2.4.2 讀操作 100
2.4.3 批量寫操作 106
2.4.4 批量讀操作 109
2.4.5 部分批量寫操作 117
2.4.6 部分批量讀操作 120
2.4.7 嚮通道的指定position位置寫入數據 128
2.4.8 讀取通道指定位置的數據 130
2.4.9 設置位置與獲得大小 135
2.4.10 截斷緩衝區 136
2.4.11 將數據傳輸到其他可寫入字節通道 138
2.4.12 將字節從給定可讀取字節通道傳輸到此通道的文件中 141
2.4.13 執行鎖定操作 145
2.4.14 FileLock lock()方法的使用 160
2.4.15 獲取通道文件給定區域的鎖定 160
2.4.16 FileLock tryLock()方法的使用 162
2.4.17 FileLock類的使用 162
2.4.18 強製將所有對通道文件的更新寫入包含文件的存儲設備 165
2.4.19 將通道文件區域直接映射到內存 167
2.4.20 打開一個文件 174
2.4.21 判斷當前通道是否打開 181
2.5 小結 182
第3章 獲取網絡設備信息 183
3.1 NetworkInterface類的常用方法 184
3.1.1 獲得網絡接口的基本信息 186
3.1.2 獲取MTU大小 189
3.1.3 子接口的處理 190
3.1.4 獲得硬件地址 192
3.1.5 獲得IP地址 194
3.1.6 InterfaceAddress類的使用 200
3.1.7 判斷是否為點對點設備 202
3.1.8 是否支持多播 202
3.2 NetworkInterface類的靜態方法 204
3.2.1 根據索引獲得NetworkInterface對象 204
3.2.2 根據網絡接口名稱獲得NetworkInterface對象 204
3.2.3 根據IP地址獲得NetworkInterface對象 205
3.3 小結 205
第4章 實現Socket通信 206
4.1 基於TCP的Socket通信 206
4.1.1 驗證ServerSocket類的accept()方法具有阻塞特性 207
4.1.2 驗證Socket中InputStream類的read()方法也具有阻塞特性 210
4.1.3 客戶端嚮服務端傳遞字符串 212
4.1.4 服務端嚮客戶端傳遞字符串 213
4.1.5 允許多次調用write()方法進行寫入操作 215
4.1.6 實現服務端與客戶端多次的往來通信 216
4.1.7 調用Stream的close()方法造成Socket關閉 219
4.1.8 使用Socket傳遞PNG圖片文件 221
4.1.9 TCP連接的3次“握手”過程 222
4.1.10 標誌位SYN與ACK值的自增特性 225
4.1.11 TCP斷開連接的4次“揮手”過程 226
4.1.12 “握手”的時機與立即傳數據的特性 227
4.1.13 結閤多綫程Thread實現通信 228
4.1.14 服務端與客戶端互傳對象以及I/O流順序問題 231
4.2 ServerSocket類的使用 233
4.2.1 接受accept與超時Timeout 233
4.2.2 構造方法的backlog參數含義 235
4.2.3 參數backlog的默認值 237
4.2.4 構造方法ServerSocket (int port, int backlog, InetAddress bindAddr)的使用 238
4.2.5 綁定到指定的Socket地址 240
4.2.6 綁定到指定的Socket地址並設置backlog數量 242
4.2.7 獲取本地SocketAdress對象以及本地端口 243
4.2.8 InetSocketAddress類的使用 244
4.2.9 關閉與獲取關閉狀態 247
4.2.10 判斷Socket綁定狀態 248
4.2.11 獲得IP地址信息 249
4.2.12 Socket選項ReuseAddress 249
4.2.13 Socket選項ReceiveBufferSize 257
4.3 Socket類的使用 259
4.3.1 綁定bind與connect以及端口生成的時機 259
4.3.2 連接與超時 261
4.3.3 獲得遠程端口與本地端口 262
4.3.4 獲得本地InetAddress地址與本地SocketAddress地址 263
4.3.5 獲得遠程InetAddress與遠程SocketAddress()地址 264
4.3.6 套接字狀態的判斷 265
4.3.7 開啓半讀與半寫狀態 266
4.3.8 判斷半讀半寫狀態 268
4.3.9 Socket選項TcpNoDelay 270
4.3.10 Socket選項SendBufferSize 274
4.3.11 Socket選項Linger 276
4.3.12 Socket選項Timeout 287
4.3.13 Socket選項OOBInline 288
4.3.14 Socket選項KeepAlive 291
4.3.15 Socket選項TrafficClass 293
4.4 基於UDP的Socket通信 294
4.4.1 使用UDP實現Socket通信 295
4.4.2 測試發送超大數據量的包導緻數據截斷的情況 297
4.4.3 Datagram Packet類中常用API的使用 299
4.4.4 使用UDP實現單播 300
4.4.5 使用UDP實現廣播 301
4.4.6 使用UDP實現組播 303
4.5 小結 305
第5章 選擇器的使用 306
5.1 選擇器與I/O多路復用 306
5.2 核心類Selector、SelectionKey和SelectableChannel的關係 307
5.3 通道類AbstractInterruptibleChannel與接口InterruptibleChannel的介紹 310
5.4 通道類SelectableChannel的介紹 311
5.5 通道類AbstractSelectableChannel的介紹 313
5.6 通道類ServerSocketChannel與接口NetworkChannel的介紹 313
5.7 ServerSocketChannel類、Selector和SelectionKey的使用 315
5.7.1 獲得ServerSocketChannel與ServerSocket socket對象 316
5.7.2 執行綁定操作 317
5.7.3 執行綁定操作與設置backlog 317
5.7.4 阻塞與非阻塞以及accept()方法的使用效果 318
5.7.5 獲得Selector對象 320
5.7.6 執行注冊操作與獲得SelectionKey對象 321
5.7.7 判斷注冊的狀態 322
5.7.8 將通道設置成非阻塞模式再注冊到選擇器 323
5.7.9 使用configureBlocking (false)方法解決異常 323
5.7.10 判斷打開的狀態 324
5.7.11 獲得阻塞鎖對象 325
5.7.12 獲得支持的SocketOption列錶 325
5.7.13 獲得與設置SocketOption 327
5.7.14 獲得SocketAddress對象 327
5.7.15 阻塞模式的判斷 328
5.7.16 根據Selector找到對應的SelectionKey 328
5.7.17 獲得SelectorProvider對象 329
5.7.18 通道注冊與選擇器 330
5.7.19 返迴此通道所支持的操作 332
5.7.20 執行Connect連接操作 333
5.7.21 判斷此通道上是否正在進行連接操作 336
5.7.22 完成套接字通道的連接過程 338
5.7.23 類FileChannel中的long tran-sferTo (position, count, Writable-ByteChannel)方法的使用 340
5.7.24 方法public static SocketChannel open (SocketAddress remote)與SocketOption的執行順序 342
5.7.25 傳輸大文件 344
5.7.26 驗證read和write方法是非阻塞的 346
5.8 Selector類的使用 348
5.8.1 驗證public abstract int select()方法具有阻塞性 350
5.8.2 select()方法不阻塞的原因和解決辦法 351
5.8.3 齣現重復消費的情況 353
5.8.4 使用remove()方法解決重復消費問題 355
5.8.5 驗證産生的set1和set2關聯的各自對象一直是同一個 356
5.8.6 int selector.select()方法返迴值的含義 360
5.8.7 從已就緒的鍵集中獲得通道中的數據 362
5.8.8 對相同的通道注冊不同的相關事件返迴同一個SelectionKey 363
5.8.9 判斷選擇器是否為打開狀態 365
5.8.10 獲得SelectorProvider provider對象 365
5.8.11 返迴此選擇器的鍵集 366
5.8.12 public abstract int select(long timeout)方法的使用 367
5.8.13 public abstract int selectNow()方法的使用 368
5.8.14 喚醒操作 369
5.8.15 測試若乾細節 370
5.9 SelectionKey類的使用 380
5.9.1 判斷是否允許連接SelectableChannel對象 381
5.9.2 判斷是否已準備好進行讀取 383
5.9.3 判斷是否已準備好進行寫入 384
5.9.4 返迴SelectionKey關聯的選擇器 386
5.9.5 在注冊操作時傳入attachment附件 387
5.9.6 設置attachment附件 389
5.9.7 獲取與設置此鍵的interest集閤 390
5.9.8 判斷此鍵是否有效 392
5.9.9 獲取此鍵的ready操作集閤 392
5.9.10 取消操作 395
5.10 DatagramChannel類的使用 396
5.1 0.1 使用DatagramChannel類實現UDP通信 398
5.1 0.2 連接操作 399
5.1 0.3 斷開連接 400
5.1 0.4 將通道加入組播地址 400
5.1 0.5 將通道加入組播地址且接收指定客戶端數據 402
5.11 Pipe.SinkChannel和Pipe.SourceChannel類的使用 403
5.12 SelectorProvider類的使用 406
5.13 小結 407
第6章 AIO的使用 408
6.1 AsynchronousFileChannel類的使用 408
6.1.1 獲取此通道文件的獨占鎖 409
6.1.2 獲取通道文件給定區域的鎖 410
6.1.3 實現重疊鎖定 412
6.1.4 返迴此通道文件當前大小與通道打開狀態 413
6.1.5 CompletionHandler接口的使用 413
6.1.6 public void failed (Throwable exc, A attachment)方法調用時機 414
6.1.7 執行指定範圍的鎖定與傳入附件及整閤接口 415
6.1.8 執行鎖定與傳入附件及整閤接口CompletionHandler 416
6.1.9 lock (position, size, shared, attachment,CompletionHandler)方法的特點 418
6.1.10 讀取數據方式1 420
6.1.11 讀取數據方式2 420
6.1.12 寫入數據方式1 421
6.1.13 寫入數據方式2 422
6.2 AsynchronousServerSocketChannel和AsynchronousSocketChannel類的使用 422
6.2.1 接受方式1 425
6.2.2 接受方式2 427
6.2.3 重復讀與重復寫齣現異常 428
6.2.4 讀數據 429
6.2.5 寫數據 433
6.3 同步、異步、阻塞與非阻塞之間的關係 436
6.4 小結 437
· · · · · · (
收起)