成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java NIO的介紹及工作原理

開發 后端
針對傳統I/O 工作模式的不足,NIO 工具包提出了基于Buffer(緩沖區)、Channel(通道)、Selector(選擇器)的新模式;Selector(選擇器)、可選擇的Channel(通道)和SelectionKey(選擇鍵)配合起來使用,可以實現并發的非阻塞型I/O 能力。

 針對傳統I/O 工作模式的不足,NIO 工具包提出了基于Buffer(緩沖區)、Channel(通道)、Selector(選擇器)的新模式;Selector(選擇器)、可選擇的Channel(通道)和SelectionKey(選擇鍵)配合起來使用,可以實現并發的非阻塞型I/O 能力。

NIO 工具包的成員

Buffer(緩沖器)

Buffer 類是一個抽象類,它有7 個子類分別對應于七種基本的數據類型:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer 和ShortBuffer。每一個Buffer對象相當于一個數據容器,可以把它看作內存中的一個大的數組,用來存儲和提取所有基本類型(boolean 型除外)的數據。Buffer 類的核心是一塊內存區,可以直接對其執行與內存有關的操作,利用操作系統特性和能力提高和改善Java 傳統I/O 的性能。

Channel(通道)

Channel 被認為是NIO 工具包的一大創新點,是(Buffer)緩沖器和I/O 服務之間的通道,具有雙向性,既可以讀入也可以寫出,可以更高效的傳遞數據。我們這里主要討論ServerSocketChannel 和SocketChannel,它們都繼承了SelectableChannel,是可選擇的通道,分別可以工作在同步和異步兩種方式下(這里的可選擇不是指可以選擇兩種工作方式,而是指可以有選擇的注冊自己感興趣的事件)。當通道工作在同步方式時,它的功能和編程方法與傳統的ServerSocket、Socket 對象相似;當通道工作在異步工作方式時,進行輸入輸出處理不必等到輸入輸出完畢才返回,并且可以將其感興趣的(如:接受操作、連接操作、讀出操作、寫入操作)事件注冊到Selector 對象上,與Selector 對象協同工作可以更有效率的支持和管理并發的網絡套接字連接。

Selector(選擇器)和SelectionKey(選擇鍵)

各類 Buffer 是數據的容器對象;各類Channel 實現在各類Buffer 與各類I/O 服務間傳輸數據。Selector 是實現并發型非阻塞I/O 的核心,各種可選擇的通道將其感興趣的事件注冊到Selector 對象上,Selector 在一個循環中不斷輪循監視這各些注冊在其上的Socket 通道。SelectionKey 類則封裝了SelectableChannel 對象在Selector 中的注冊信息。當Selector 監測到在某個注冊的SelectableChannel 上發生了感興趣的事件時,自動激活產生一個SelectionKey對象,在這個對象中記錄了哪一個SelectableChannel 上發生了哪種事件,通過對被激活的SelectionKey 的分析,外界可以知道每個SelectableChannel 發生的具體事件類型,進行相應的處理。

NIO 工作原理

通過上面的討論,我們可以看出在并發型服務器程序中使用NIO,實際上是通過網絡事件驅動模型實現的。我們應用Select 機制,不用為每一個客戶端連接新啟線程處理,而是將其注冊到特定的Selector 對象上,這就可以在單線程中利用Selector 對象管理大量并發的網絡連接,更好的利用了系統資源;采用非阻塞I/O 的通信方式,不要求阻塞等待I/O 操作完成即可返回,從而減少了管理I/O 連接導致的系統開銷,大幅度提高了系統性能。

當有讀或寫等任何注冊的事件發生時,可以從Selector 中獲得相應的SelectionKey , 從SelectionKey 中可以找到發生的事件和該事件所發生的具體的SelectableChannel,以獲得客戶端發送過來的數據。由于在非阻塞網絡I/O 中采用了事件觸發機制,處理程序可以得到系統的主動通知,從而可以實現底層網絡I/O 無阻塞、流暢地讀寫,而不像在原來的阻塞模式下處理程序需要不斷循環等待。使用NIO,可以編寫出性能更好、更易擴展的并發型服務器程序。

并發型服務器程序的實現代碼

應用 NIO 工具包,基于非阻塞網絡I/O 設計的并發型服務器程序與以往基于阻塞I/O 的實現程序有很大不同,在使用非阻塞網絡I/O 的情況下,程序讀取數據和寫入數據的時機不是由程序員控制的,而是Selector 決定的。下面便給出基于非阻塞網絡I/O 的并發型服務器程序的核心代碼片段:

  1. import java.io.*; //引入Java.io包 
  2. import java.net.*; //引入Java.net包 
  3. import java.nio.channels.*; //引入Java.nio.channels包 
  4. import java.util.*; //引入Java.util包 
  5. public class TestServer implements Runnable 
  6. /** 
  7. * 服務器Channel對象,負責接受用戶連接 
  8. */ 
  9. private ServerSocketChannel server; 
  10. /** 
  11. * Selector對象,負責監控所有的連接到服務器的網絡事件的發生 
  12. */ 
  13. private Selector selector; 
  14. /** 
  15. * 總的活動連接數 
  16. */ 
  17. private int activeSockets; 
  18. /** 
  19. * 服務器Channel綁定的端口號 
  20. */ 
  21. private int port ; 
  22. /** 
  23. * 
  24. * 構造函數 
  25. */ 
  26. public TestServer()throws IOException 
  27. activeSockets=0; 
  28. port=9999//初始化服務器Channel綁定的端口號為9999 
  29. selector= Selector.open();//初始化Selector對象 
  30. server=ServerSocketChannel.open();//初始化服務器Channel對象 
  31. ServerSocket socket=server.socket();//獲取服務器Channel對應的//ServerSocket對象 
  32. socket.bind(new InetSocketAddress(port));//把Socket綁定到監聽端口9999上 
  33. server.configureBlocking(false);//將服務器Channel設置為非阻塞模式 
  34. server.register(selector,SelectionKey.OP_ACCEPT);//將服務器Channel注冊到 
  35. Selector對象,并指出服務器Channel所感興趣的事件為可接受請求操作 
  36. public void run() 
  37. while(true
  38. try 
  39. /** 
  40. *應用Select機制輪循是否有用戶感興趣的新的網絡事件發生,當沒有 
  41. * 新的網絡事件發生時,此方法會阻塞,直到有新的網絡事件發生為止 
  42. */ 
  43. selector.select(); 
  44. catch(IOException e) 
  45. continue//當有異常發生時,繼續進行循環操作 
  46. /** 
  47. * 得到活動的網絡連接選擇鍵的集合 
  48. */ 
  49. Set<SelectionKey> keys=selector.selectedKeys(); 
  50. activeSockets=keys.size();//獲取活動連接的數目 
  51. if(activeSockets==0
  52. continue//如果連接數為0,則繼續進行循環操作 
  53. /** 
  54. /** 
  55. * 應用For—Each循環遍歷整個選擇鍵集合 
  56. */ 
  57. for(SelectionKey key :keys) 
  58. /** 
  59. * 如果關鍵字狀態是為可接受,則接受連接,注冊通道,以接受更多的* 
  60. 事件,進行相關的服務器程序處理 
  61. */ 
  62. if(key.isAcceptable()) 
  63. doServerSocketEvent(key); 
  64. continue; 
  65. /** 
  66. * 如果關鍵字狀態為可讀,則說明Channel是一個客戶端的連接通道, 
  67. * 進行相應的讀取客戶端數據的操作 
  68. */ 
  69. if(key.isReadable()) 
  70. doClientReadEvent(key); 
  71. continue; 
  72. /** 
  73. * 如果關鍵字狀態為可寫,則也說明Channel是一個客戶端的連接通道, 
  74. * 進行相應的向客戶端寫數據的操作 
  75. */ 
  76. if(key.isWritable()) 
  77. doClinetWriteEvent(key); 
  78. continue; 
  79. /** 
  80. * 處理服務器事件操作 
  81. * @param key 服務器選擇鍵對象 
  82. */ 
  83. private void doServerSocketEvent(SelectionKey key) 
  84. SocketChannel client=null; 
  85. try 
  86. ServerSocketChannel server=(ServerSocketChannel)key.channel(); 
  87. client=server.accept(); 
  88. if(client==null
  89. return; 
  90. client.configureBlocking(false);//將客戶端Channel設置為非阻塞型 
  91. /** 
  92. /** 
  93. * 將客戶端Channel注冊到Selector對象上,并且指出客戶端Channel所感 
  94. * 興趣的事件為可讀和可寫 
  95. */ 
  96. client.register(selector,SelectionKey.OP_READ|SelectionKey.OP_READ); 
  97. }catch(IOException e) 
  98. try 
  99. client.close(); 
  100. }catch(IOException e1){} 
  101. /** 
  102. * 進行向客戶端寫數據操作 
  103. * @param key 客戶端選擇鍵對象 
  104. */ 
  105. private void doClinetWriteEvent(SelectionKey key) 
  106. 代碼實現略; 
  107. /** 
  108. * 進行讀取客戶短數據操作 
  109. * @param key 客戶端選擇鍵對象 
  110. */ 
  111. private void doClientReadEvent(SelectionKey key) 
  112. 代碼實現略; 

從上面對代碼可以看出,使用非阻塞性I/O進行并發型服務器程序設計分三個部分:1.向Selector對象注冊感興趣的事件;2.從Selector中獲取所感興趣的事件;3.根據不同的事件進行相應的處理。

結  語

通過使用NIO 工具包進行并發型服務器程序設計,一個或者很少幾個Socket 線程就可以處理成千上萬個活動的Socket 連接,大大降低了服務器端程序的開銷;同時網絡I/O 采取非阻塞模式,線程不再在讀或寫時阻塞,操作系統可以更流暢的讀寫數據并可以更有效地向CPU 傳遞數據進行處理,以便更有效地提高系統的性能。

原文鏈接:http://futureinhands.iteye.com/blog/953576

【編輯推薦】

  1. Java NIO之選擇就緒模式
  2. Apache Ant對決Make:實戰Java構建工具
  3. 從思路開始 Java如何實現條件編譯
  4. Java七步創建以JDBC連接數據庫的程序
  5. 面試Java前必須了解的10個概念
責任編輯:林師授 來源: FutureInHands的博客
相關推薦

2011-12-14 10:31:43

2011-12-20 15:52:03

PhoneGap架構基礎工作原理

2012-04-11 15:41:48

JavaNIO

2009-12-30 16:48:45

2011-08-11 16:29:49

Oracle數據庫AWRASH

2012-06-29 13:54:11

Java內存原型

2023-09-27 12:22:50

Kafka架構

2010-10-09 08:50:16

2012-05-15 02:18:31

Java線程池

2022-09-04 21:08:50

響應式設計Resize

2010-02-06 17:36:58

Dalvik虛擬機

2023-10-17 10:11:50

TCPIP

2020-07-10 09:04:55

HTTPS瀏覽器網絡協議

2018-06-29 23:21:27

物聯網IoT網絡

2009-06-04 10:41:52

Struts工作原理

2012-04-18 16:42:03

PhoneGap

2013-11-19 09:53:17

2011-06-19 11:48:27

百度蜘蛛

2011-12-08 10:51:25

JavaNIO

2011-01-04 18:15:21

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av在线播放网站 | 亚洲精品一区二区 | 成人一区二区三区在线 | 中文字幕亚洲一区 | 日韩精品免费在线观看 | 国产在线精品一区二区三区 | 男女网站免费 | av黄色在线 | 夜夜摸天天操 | 精品久久久久国产免费第一页 | 亚洲 精品 综合 精品 自拍 | 国产精成人| 国产精品亚洲精品日韩已方 | 亚洲人精品午夜 | 久久久久久久久国产 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 81精品国产乱码久久久久久 | 亚洲精品中文在线 | 国产亚洲一区二区三区在线观看 | 中文字幕亚洲精品 | 成人精品视频在线观看 | 国产在线精品免费 | 中文字幕免费在线 | 亚洲一区二区三区四区五区中文 | 欧美专区日韩 | 国产露脸对白88av | 在线视频一区二区 | 91成人在线视频 | 日韩一区二区免费视频 | 91视频a | 中文字幕在线免费 | 99热首页 | 玩丰满女领导对白露脸hd | 成年人免费在线视频 | 国产男女猛烈无遮掩视频免费网站 | 国产精品一区二区在线 | 国产一级影片 | 天天操网| 午夜小电影 | 亚洲激情av | 91电影|