① java 非阻塞通信(NIO)相比普通socket通信,非阻塞表現在哪裡本質區別是什麼
0,則侍重連,重新再來過一次唄。
1,NIO 本身是提供非阻塞式的網路訪問,使用 selector 來輪詢事件,因此用 selector 才能改進性能,一個 selector 可以用在多個 socket 通信中而不像以前傳統的一個線程一個 socket 流這么麻煩地管理它們。
2,客戶端與服務端是互不影響的,完全不相關。我們完全不需要關心對方是C++ / VB 還是 Java ,只要雙方使用的都是 TCP 協議就行了。
NIO 是在與操作系統的模塊打交道,盡量提高性能,所有的真實過程其實都是在 JVM 的 native 代碼孫陸吵與操作系統中處理了,對我們應用程序來說,使用什麼方法並悉敗沒有區別。
② JAVA NIO 和 AIO 的區別
Java NIO : 同步非阻塞,伺服器實現模式為一個請求一個線程,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有I/O請求時才啟動一個線程進行處理。
Java AIO(NIO.2) : 非同步非阻塞,伺服器實現模式為一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知伺服器應用去啟動線程進行處理,
NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天伺服器,並發局限於應用中,編程比較復雜,JDK1.4開始支持。
AIO方式使用於連接數目多且連接比較長(重操作)的架構,比如相冊伺服器,充分調用OS參與並發操作,編程比較復雜,JDK7開始支持
I/O屬於底層操作,需要操作系統支持,並發也需要操作系統的支持,所以性能方面不同操作系統差異會比較明顯。另外NIO的非阻塞,需要一直輪詢,也是一個比較耗資源的。所以出現AIO
③ java nio框架netty客戶端連接成功後為什麼會自動掉線
其實不要太迷信nio。這個東西如果你使用不當,效率還不如io高。 而且,使用了nio會造成和以前的代碼的不兼容。 當然,你是高手,那就例外了。
④ java 高並發 都有哪些技術
我用的JAVA NIO,一般常用的高並發IO框架,也是用的這個做擴展。
Java NIO是在jdk1.4開始使用的,它既可以說成「新I/O」,也可以說成非阻塞式I/O。下面是java NIO的工作原理:
1. 由一個專門的線程來處理所有的 IO 事件,並負責分發。
2. 事件驅動機制:事件到的時候觸發,而不是同步的去監視事件。
3. 線程通訊:線程之間通過 wait,notify 等方式通訊。保證每次上下文切換都是有意義的。減少無謂的線程切換。
Java NIO的服務端只需啟動一個專門的線程來處理所有的 IO 事件,這種通信模型是怎麼實現的呢?呵呵,我們一起來探究它的奧秘吧。java NIO採用了雙向通道(channel)進行數據傳輸,而不是單向的流(stream),在通道上可以注冊我們感興趣的事件。一共有以下四種事件:
事件名 對應值
服務端接收客戶端連接事件 SelectionKey.OP_ACCEPT(16)
客戶端連接服務端事件 SelectionKey.OP_CONNECT(8)
讀事件 SelectionKey.OP_READ(1)
寫事件 SelectionKey.OP_WRITE(4)
服務端和客戶端各自維護一個管理通道的對象,我們稱之為selector,該對象能檢測一個或多個通道 (channel) 上的事件。我們以服務端為例,如果服務端的selector上注冊了讀事件,某時刻客戶端給服務端發送了一些數據,阻塞I/O這時會調用read()方法阻塞地讀取數據,而NIO的服務端會在selector中添加一個讀事件。服務端的處理線程會輪詢地訪問selector,如果訪問selector時發現有感興趣的事件到達,則處理這些事件,如果沒有感興趣的事件到達,則處理線程會一直阻塞直到感興趣的事件到達為止。下面是我理解的java NIO的通信模型示意圖:
⑤ java Netty NIO 如何突破 65536 個埠的限制如何做到10萬~50萬的長連接
通常情況下衡陵是不可以突破的,埠有限制.單獨對外提供請求的服務不用考慮塵冊埠數量問題,監聽某一個埠即可.但咐兄戚是向提供代理伺服器,就不得不考慮埠數量受限問題了.當前的1M並發連接測試,也需要在客戶端突破6萬可用埠的限制.埠為16進制,那麼2的16次方值為65536,在linux系統裡面,1024以下埠都是超級管理員用戶(如root)才可以使用,普通用戶只能使用大於1024的埠值.
伺服器是只監聽一個埠,所有的客戶端連接,都是連接到伺服器的同一個埠上的。也就是說伺服器只是用了一個埠。就比如Http伺服器。默認只用了80埠。
nio 在linux上使用的是epoll ,epoll支持在一個進程中打開的FD是操作系統最大文件句柄數,而不是你所說的16位short表示的文件句柄。 而 select模型 單進程打開的FD是受限的 select模型默認FD是1024 。操作系統最大文件句柄數跟內存有關,1GB內存的機器上,大概是10萬個句柄左右。