您好,登錄后才能下訂單哦!
本篇內容介紹了“java nio socket的問題實例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
第一個問題:
java nio的開發過程當中,在我們一個channel對象的時候,第一步就是要把它的阻塞模式配置為非阻塞。ServerSocketChannel.configureBlocking(false);
我們試圖去了解一下這個configureBlocking函數究竟做了些什么事情,
但是最終我們找到了一個native的函數,具體內部干了些什么,貌似不是很容易了解。
那么我們試一下,把它配置為true的話,會發生什么樣的事情。
結果,在register到selector上的時候,直接報錯了。
java.nio.channels.IllegalBlockingModeException
關于這個問題,雖然沒有得到一個確切的答案,不過貌似基本能夠解決我們的一部分疑惑,要使用selector就只能是false。
第二個問題,有一個簡單的java nio的例子,當中我們用到了SelectionKey當中3個值,OP_READ、OP_CONNECT、OP_ACCEPT。但是如果我們看一下java源碼的話,會發現,其實還有一個值,叫做OP_WRITE,這個值究竟是怎么用的,因為在我們之前例子當中,server和client之間的數據交換已經基本完成,在收到read事件之后,通過channel把響應寫回去,貌似沒有OP_WRITE什么事啊!!!
首先我們對OP_READ、OP_CONNECT、OP_ACCEPT這幾個值,重新進行一下解釋,以OP_READ為例,應該解釋為read就緒,換句話說,對方,已經向我寫入數據了,這個時候開始讀了。
那么OP_WRITE就好解釋了,寫就緒,那么寫就緒的條件是什么呢?大體可以有2個條件,自己的寫緩沖區是有空間的,網絡環境是暢通的。
我們試一下,如果我們把一個SocketChannel的OP_WRITE注冊到selector上的話,會發生什么樣的事情。
修改一下之前的代碼,Server端,接收一個客戶端連接之后調用這樣一句
channel.register(this.selector, SelectionKey.OP_WRITE);//原來是OP_READ
這樣的話,因為網絡是暢通的,本地的寫緩沖區也是空間很充裕的,會一直試圖做寫的事情。
綜上所述,在網絡環境很好,以及寫出的任務量不是很大的情況下,可能并不需要OP_WRITE的使用,而在某些高并發的情況下,OP_WRITE可能還是有其實際的用途的。
“java nio socket的問題實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。