首頁 Java java教程 關於Nio具體工作流程範例程式碼

關於Nio具體工作流程範例程式碼

Jul 03, 2017 am 11:20 AM
工作 方式 經典

 1 public void selector() throws IOException { 2     
 ByteBuffer buffer = ByteBuffer.allocate(1024); 3     
 Selector selector = Selector.open(); 4     
 ServerSocketChannel ssc = ServerSocketChannel.open(); 5     
 ssc.configureBlocking(false);//设置为非阻塞模式 6     
 ssc.socket().bind(new InetSocketAddress(8080)); 7     
 ssc.register(selector, SelectionKey.OP_ACCEPT);//注册监听事件 8     
 while(true) { 9         Set selectorKeys = selector.selectorKeys();
 //取得所有key的集合10         Iterator it = selectorKeys.iterator();11         
 while(it.hasNext()) { //检查序列是否还有元素12             
 SelectionKey key = (SelectionKey) it.next();13             
 if((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {14                 
 ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();15                 
 SocketChannel sc = ssChannel.accept();//接受到服务端的请求16                 
 sc.configureBlocking(false);17                 
 sc.register(selector,SelectionKey.OP_ACCEPT);18                 
 it.remove();19             } 
 else if((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {20                 
 SocketChannel sc = (SocketChannel) key.channel;21                 
 while(true) {22                     buffer.clear();23                     
 int n = sc.read(buffer);//读取数据24                     
 if(n <= 0) {25                         
 break;26                     }                     
 buffer.flip();28                 }                
 it.remove();30             }    
 }
 }
 }
登入後複製

  上面這段程式碼是書上關於Nio具體工作過程的程式碼範例。其工作過程可以具體闡述如下:

其中有兩個關鍵的類別:##Channel和Selector,它們是NIO中的核心概念。其中Channel可類比為交通工具,而且是具體的交通工具,例如:汽車,自行車。而Selector則可類比為車輛調度系統,負責車輛運轉狀況的監控與具體調度。

serverSocketChannel類別是針對面向流的偵聽套接字的可選擇通道,在服務端建立完此類實例後透過Socket()方法(取得與此通道關聯的伺服器套接字)傳回一個ServerSocket類別的實例,在利用此實例的void bind(SocketAddress endpoint)方法將 ServerSocket 綁定到特定位址(IP 位址和連接埠號碼)。就像計程車公司的每輛計程車都要在公司註冊一樣,我們也需要將ServerSocketChannel的實例透過register()方法將此通道註冊到指定的選擇器。

然後呼叫Selector的selectedKeys方法來檢查已經註冊在這個選擇器上的所有通訊頻道是否有需要的事件發生,如果有某個事件發生,將會傳回所有的SelectionKey,由於key.readyOps()取得此鍵的ready 操作集合,因此個人認為key.readyOps()&SelectionKey.OP_ACCEPT意思是此鍵的ready 操作集合為ACCEPT狀態,即伺服器處於監聽狀態,透過這個物件的Channel方法就可以取得這個通訊頻道對象,然後呼叫accept()方法返回一個套接字通道,預設為阻塞狀態,也可以利用Channel方法取得的通訊頻道對象讀取通訊的數據,而這裡讀取的資料是Buffer,這個Buffer是我們可以控制的緩衝器。


#

以上是關於Nio具體工作流程範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go 語言的時間處理方式有哪些? Go 語言的時間處理方式有哪些? Jun 10, 2023 pm 09:42 PM

Go語言作為一個現代化的程式語言,時間在開發中佔有很重要的地位。 Go語言提供了一些內建的時間函數和結構體,使得時間的處理變得更加便捷。在本篇文章中,將會介紹一些Go語言常用的時間處理方式。 time.Now()我們可以使用time.Now()函數取得目前的時間:now:=time.Now()fmt.Println(now)輸出:2019-06-131

2023年我可以用Java技能申請哪些工作? 2023年我可以用Java技能申請哪些工作? Sep 21, 2023 am 11:41 AM

當我們談論程式語言和工作時,我們想到的程式語言是Java。全世界大多數公司都使用Java。它很受歡迎,而且有很多工作機會。如果您想在2023年借助Java技能找到工作,那麼這對您有好處,因為Java技能可以讓您快速找到工作。此外,它還能快速提升你的職涯。沒有什麼魔法能讓你快速找到工作。但你的技能對你來說就像魔法一樣。選擇一份讓你滿意的工作和一個能大幅提升你職涯的好環境。如果你是一個剛入行且有經驗的人,Java也為你提供了一份不錯的工作。許多公司使用Java作為其開發的主要程式。它

前端工程師職責解析:主要做什麼工作? 前端工程師職責解析:主要做什麼工作? Mar 25, 2024 pm 05:09 PM

前端工程師職責解析:主要做什麼工作?隨著互聯網的快速發展,前端工程師作為一個非常重要的職業角色,扮演著連接使用者與網站應用程式的橋樑,起著至關重要的作用。那麼,前端工程師主要做些什麼工作呢?本文將對前端工程師的職責進行解析,讓我們來一探究竟。一、前端工程師的基本職責網站開發與維護:前端工程師負責網站的前端開發工作,包括編寫網站的HTML、CSS和JavaScr

ChatGPT等不會很快接管人類工作,易出錯,AI也不會免費打工 ChatGPT等不會很快接管人類工作,易出錯,AI也不會免費打工 May 21, 2023 am 08:49 AM

ChatGPT等大模型的相繼發布,讓很多人倍感壓力,害怕AI很快就會接手他們的工作。對此,OpenAI也曾發表過一項研究,顯示ChatGPT的影響涵蓋所有收入階層,且高收入工作可能面臨更大的風險。事實到底如何呢?我們應該將所有的工作,即使是那些令人滿意的工作都實現自動智慧化嗎?這是未來生命研究所(FutureofLifeInstitute)最近提出的幾個問題之一,該研究所呼籲暫停大型人工智慧實驗,目前埃隆・馬斯克(ElonMusk)、SteveWozniak和AndrewYang等1萬多人均已簽署

學java能找什麼工作 學java能找什麼工作 Jan 16, 2024 pm 05:18 PM

學java能找的工作:1、企業級應用開發;2、網站開發;3、Android開發;4、嵌入式領域;5、大數據與雲端運算;6、遊戲開發;7、科學應用;8、軟體開發與維護;9、系統與網路程式設計;10、安全與加密;11、教育與訓練;12、諮詢與顧問。詳細介紹:1、企業級應用開發,Java在企業級應用開發中佔有非常重要的地位,利用Java,可以開發出各種複雜的企業級應用,如OA系統等等。

學java可以從事哪些工作 學java可以從事哪些工作 Jan 16, 2024 pm 04:58 PM

可從事的工作:1、企業級應用開發;2、網站開發;3、行動應用開發;4、遊戲開發;5、大數據分析;6、科學計算與人工智慧;7、嵌入式系統開發;8 、金融業應用開發等。詳細介紹:1.企業級應用開發:Java在企業級應用程式開發中佔據重要地位,可用於開發大型、複雜的系統,如ERP、CRM等。這些系統通常需要處理大量資料、支援高並發、保證系統穩定性;2、網站開發:包括前端和後端等等。

c語言以後做什麼工作 c語言以後做什麼工作 Jan 29, 2024 pm 02:47 PM

c語言以後可以做的工作:1、系統開發;2、遊戲開發;3、網路開發;4、應用程式開發;5、編譯器開發;6、演算法工程師;7、網路安全;8、硬體開發;9 、教育領域;10、資料分析與機器學習;11、軟體開發與維護;12、軟體測試。詳細介紹:1、系統開發,C語言是系統級程式設計的常用語言,可用於開發作業系統、嵌入式系統,掌握了C語言,可以成為系統開發工程師;2、遊戲開發等等​​。

如何刪除 Chrome 網址列中不需要的網址? 如何刪除 Chrome 網址列中不需要的網址? Mar 08, 2024 am 09:19 AM

Chrome會自動在網址列中記錄曾經輸入過的網址,並且會在未來自動“聯想查詢內容”,但很多時候我們並不需要一些網址,如何刪掉它們呢?小編常常遇到這樣的困擾,曾經輸入過的地址,會擋在常用地址的前面,導致需要選好幾次才能進入需要的網站。為此我也找過至少3次如何刪除了,因為…每次都會忘記。在Chrome官方幫助Chrome鍵盤快捷鍵的地址列快捷鍵中,就明確了刪除快捷鍵:▍Windows刪除地址列聯想內容按向下箭頭鍵以突出顯示相應內容,然後按Shift+Delete鍵▍macOS刪除地址欄聯想內容按向下

See all articles