溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java nio socket的問題實例分析

發(fā)布時間:2021-12-16 16:48:44 來源:億速云 閱讀:153 作者:iii 欄目:云計算

本篇內(nèi)容介紹了“java nio socket的問題實例分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

第一個問題:

java nio的開發(fā)過程當(dāng)中,在我們一個channel對象的時候,第一步就是要把它的阻塞模式配置為非阻塞。ServerSocketChannel.configureBlocking(false);

我們試圖去了解一下這個configureBlocking函數(shù)究竟做了些什么事情,

但是最終我們找到了一個native的函數(shù),具體內(nèi)部干了些什么,貌似不是很容易了解。

那么我們試一下,把它配置為true的話,會發(fā)生什么樣的事情。

結(jié)果,在register到selector上的時候,直接報錯了。

java.nio.channels.IllegalBlockingModeException

關(guān)于這個問題,雖然沒有得到一個確切的答案,不過貌似基本能夠解決我們的一部分疑惑,要使用selector就只能是false。

第二個問題,有一個簡單的java nio的例子,當(dāng)中我們用到了SelectionKey當(dāng)中3個值,OP_READ、OP_CONNECT、OP_ACCEPT。但是如果我們看一下java源碼的話,會發(fā)現(xiàn),其實還有一個值,叫做OP_WRITE,這個值究竟是怎么用的,因為在我們之前例子當(dāng)中,server和client之間的數(shù)據(jù)交換已經(jīng)基本完成,在收到read事件之后,通過channel把響應(yīng)寫回去,貌似沒有OP_WRITE什么事?。。。?/p>

首先我們對OP_READ、OP_CONNECT、OP_ACCEPT這幾個值,重新進(jìn)行一下解釋,以O(shè)P_READ為例,應(yīng)該解釋為read就緒,換句話說,對方,已經(jīng)向我寫入數(shù)據(jù)了,這個時候開始讀了。

那么OP_WRITE就好解釋了,寫就緒,那么寫就緒的條件是什么呢?大體可以有2個條件,自己的寫緩沖區(qū)是有空間的,網(wǎng)絡(luò)環(huán)境是暢通的。

我們試一下,如果我們把一個SocketChannel的OP_WRITE注冊到selector上的話,會發(fā)生什么樣的事情。

修改一下之前的代碼,Server端,接收一個客戶端連接之后調(diào)用這樣一句

channel.register(this.selector, SelectionKey.OP_WRITE);//原來是OP_READ

這樣的話,因為網(wǎng)絡(luò)是暢通的,本地的寫緩沖區(qū)也是空間很充裕的,會一直試圖做寫的事情。

綜上所述,在網(wǎng)絡(luò)環(huán)境很好,以及寫出的任務(wù)量不是很大的情況下,可能并不需要OP_WRITE的使用,而在某些高并發(fā)的情況下,OP_WRITE可能還是有其實際的用途的。

“java nio socket的問題實例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI