Java NIO (Non-blocking I/O) with Server-Client Example – java.nio.ByteBuffer 和 channels.Selector – Java NIO Vs. IO

已發表: 2021-08-06
帶有服務器-客戶端示例的 Java NIO(非阻塞 I:O) - CrunchifyNIOServer.java

Java NIO是我最喜歡的話題。 自過去 2 年以來,我一直在與 NIO 合作,我想為我的讀者分享簡單Server-Client code ,他們可以在他們的生產環境中免費使用這些代碼。

從 JDK 1.4 開始,創建 NIO 是為了允許所有 Java 程序員實現非常高速的輸入/輸出,而無需處理自定義的本機代碼。 NIO 使用java.nio.buffer庫與簡單的 I/O 相比,後者在任何操作系統內部耗盡和填充緩衝區。

在本教程中,我們將java.nio.channelsjava.nio.channels.Selector庫。

  • channels表示與能夠執行 I/O 操作的實體的連接,例如文件和套接字; 定義 selectors ,用於多路復用的非阻塞 I/O 操作。
  • 可以通過調用該類的open method來創建selector ,該方法將使用系統默認的選擇器提供程序來創建一個新的選擇器。
帶有 API 詳細信息的 java.nio 包說明

如果您有below questions ,那麼您來對地方了:

  • 如何開始使用 Java NIO
  • 什麼是Java NIO和Java NIO教程
  • 異步 Java NIO
  • java nio包的具體用途是什麼
  • Java NIO 教程
  • 如何使用 Java NIO 實現高性能 I/O

讓我們開始吧:

第1步

  • 創建CrunchifyNIOServer.javaport 1111上打開連接
  • 使用isAcceptable()檢查通道是否準備好接受新的套接字連接
    • 如果是 - 連接它
  • 使用isReadable()檢查通道是否準備好讀取
    • 如果是 - 從緩衝區讀取並在 Eclipse 控制台上打印
  • 一旦你得到最後的公司名稱“crunchify”
    • 緊密連接

第2步

  • 創建CrunchifyNIOClient.java嘗試連接到port 1111上的服務器
  • 使用 5 個公司名稱創建 ArrayList
  • 遍歷 ArrayList 並將每個 companyName 發送到服務器
  • 任務完成後關閉連接

看看這個Java代碼:

服務器代碼——CrunchifyNIOServer.java


客戶端代碼——CrunchifyNIOClient.java

帶有服務器-客戶端示例的 Java NIO(非阻塞 I:O) - CrunchifyNIOClient.java

服務器端的結果:

客戶端結果:


幾個常見問題解答:

  1. 從客戶端,我如何維護持久連接?
    • 你可以使用socket.setKeepAlive(true); 從客戶端建立連接。
  2. 如何閱讀對發送到服務器的消息的響應。 服務器每 10 秒不斷生成消息。 我只需要閱讀對我的請求的回复。 據我了解,TCP“流”數據而不是記錄結束等。
    • 對於客戶端服務器通信,需要明確定義協議。 readLine()調用將被阻塞,直到所有數據都返回,所以不要使用它。 Try reading bytes from the stream until -1 is returned.

讓我知道這是否有效。