摘要:一個多路復(fù)用器可以負(fù)責(zé)成千上萬的通道,沒有上限。不需要通過對多路復(fù)用器對注冊的通道進(jìn)行輪詢操作即可實(shí)現(xiàn)異步讀寫,從而簡化編程模型。同時,支持支持如果是怎么辦最后,到目前位置,支持不支持二無法擴(kuò)展作為的核心,無法擴(kuò)展,私有構(gòu)造函數(shù)。
前言
netty 學(xué)習(xí) 基于 netty in action 5th, 官網(wǎng)資料,網(wǎng)絡(luò)博客等
1.1 Why Netty?netty 是一個中間層的抽象
"all problems in computer science can be solved by another
level of indirection"
netty 是一個中間層的抽象,因為底層的網(wǎng)絡(luò)編程的各種問題
Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients.
"Quick And Easy"是如何保證的
Netty 的實(shí)現(xiàn)者汲取了 它人實(shí)現(xiàn) FTP, SMTP, HTTP, WebSocket, SPDY and various binary and text-based legacy protocols 中遇到的問題,take great care in its design。并沒有在可擴(kuò)展,靈活性,穩(wěn)定性上做出妥協(xié)。
2011年Netty 之父離開redhat加入Twitter, 所以redhat、twitter是netty的兩個主要貢獻(xiàn)公司,
netty的許多特性也是眾多大公司項目需求導(dǎo)致的。
zero copy capable rich byte buffer
參考:https://segmentfault.com/a/11...
java io 會涉及到copy,
比如,一個請求有兩個bytebuffer, 分別是請求頭,和請求正文,那么,我們接收請求后的處理是,定義一個大的bytebuffer將這兩個bytebuffer的內(nèi)容copy到大數(shù)組中。
netty可以用CompositeByteBuf,利用一個抽象的邏輯Buffer來避免這個事情。
比如,java 的文件讀寫,我們一般會定義一個小數(shù)組,在輸入流和輸出流之間讀寫,這樣就涉及了一次copy.
netty 的FileRegion 利用Java NIO FileChannel.transfer可以避免這個問題。
還有其它的情況。
統(tǒng)一的api
傳統(tǒng)的 Java I/O API 在應(yīng)對不同的傳輸協(xié)議時需要使用不同的類型和方法。比如
java.net.Socket 和 java.net.DatagramSocket 它們并不具有相同的超類型
tcp,udp,ftp...多種協(xié)議擴(kuò)展會很麻煩
bio、nio、aio api 也是不同的
Extensible event module
1.2 Asynchronous by designcallback java
Future
參考:https://www.cnblogs.com/cz123...
FutureTask:
構(gòu)造函數(shù)接收一個Callable對象,這個對象只有一個call 方法,有返回值,會拋出異常。
FutureTask繼承Runnable,說明可以作為一個參數(shù)傳到Thread中,其中的run方法,調(diào)用的是Callable中的call方法。
FutureTask繼承Future,Future中有isDone,cancel,is...方法可以控制Callable的call方法返回狀況。
參考:java-netty-study-1-bio和nio(https://segmentfault.com/a/11...)
1.3.2 Non-blocking IO basicsjdk1.4的nio,和jdk1.7的nio2的api不同,但是底層的一些特性是相同的,比如都是用bytebuffer做為數(shù)據(jù)的容器。
ByteBuffer:
BYTEBUFFER
A ByteBuffer is fundamental to both NIO APIs and, indeed, to Netty. A ByteBuffer can
either be allocated on the heap or directly, which means its stored outside of the HeapSpace. Usually, using a direct buffer is faster when passing it to the channel, but the
allocation/deallocation costs are higher. In both cases, the API for a ByteBuffer is the same,
which provides a unified way of accessing and manipulating data. A ByteBuffer allows the
same data to be easily shared between ByteBuffer instances without the need to do any
memory copying.
bytebuffer,要注意,一個是堆外內(nèi)存,適用于頻繁使用的臨時區(qū)域
(一般java讀取數(shù)據(jù),都是后現(xiàn)將數(shù)據(jù)從堆內(nèi)copy一份到堆外,然后再操作)
selector
簡單說,就是Selector會不斷的輪詢注冊在其上的通道(Channel),如果某個通道發(fā)生了讀寫操作,這個通道就處于就緒狀態(tài),會被Selector輪詢出來,然后通過SelectionKey可以取得就緒的Channel集合,從而進(jìn)行后續(xù)的IO操作。一個多路復(fù)用器(Selector)可以負(fù)責(zé)成千上萬的通道(Channel),沒有上限。這也是JDK使用了epoll代替?zhèn)鹘y(tǒng)的select實(shí)現(xiàn),獲得連接句柄(客戶端)沒有限制。那也就意味著我們只要一個線程負(fù)責(zé)Selector的輪詢,就可以接入成千上萬個客戶端,這是JDK NIO庫的巨大進(jìn)步
Nio Vs Aio
nio和aio 區(qū)別:在NIO的基礎(chǔ)上引入了異步通道的概念,并提供了異步文件和異步套接字通道的實(shí)現(xiàn),從而在真正意義上實(shí)現(xiàn)了異步非阻塞,之前的NIO只是非阻塞而并非異步。AIO不需要通過對多路復(fù)用器對注冊的通道進(jìn)行輪詢操作即可實(shí)現(xiàn)異步讀寫,從而簡化NIO編程模型。
1、nio 是圍繞selector,selector上注冊的serversocketchannel,socketchannel,及確定的注冊事件。
2、aio 簡化了nio操作,當(dāng)一個event(Accept,Connect,read,write)發(fā)生時,CompletionHandler會處理,使得用戶專注于業(yè)務(wù)邏輯。
一、Nio 依賴底層的操作系統(tǒng),有跨平臺問題。
When using NIO you often find that your code works fine on Linux, for example, but has problems on Windows.
同時,jdk1.4支持nio, 1.7 支持nio2. 如果是jdk1.6 怎么辦
最后,到目前位置,nio.2 支持tcp, 不支持udp.
二、無法擴(kuò)展
作為nio的核心,bytebuffer 無法擴(kuò)展,私有構(gòu)造函數(shù)。netty 實(shí)現(xiàn)了自己的bytebuffer.
三、NIO對緩沖區(qū)的聚合和分散操作可能會操作內(nèi)存泄露
四、 epoll bug
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71776.html
摘要:操作指引該文件服務(wù)組件的使用需要分為兩個部分,一個是服務(wù)端配置與啟動,一個是客戶端的配置與啟動。在調(diào)用文件服務(wù)返回的路徑的時候,需要用到服務(wù)端訪問文件的地址,進(jìn)而訪問相應(yīng)的文件內(nèi)容。 本文所述文件服務(wù)組件在筆者此前一篇文章中已有闡述(基于netty的文件上傳下載組件),不過本文將基于之前這個實(shí)現(xiàn)再次進(jìn)行升級改造,利用基于注解的方式進(jìn)行自動裝配。 1. 簡介 1.1 Netty簡介 Ne...
摘要:完成客戶端服務(wù)器通信,需要基于協(xié)議之上,自定義一套簡單的通信協(xié)議,其中數(shù)據(jù)交換方式需要使用自定義幀。輸入數(shù)據(jù)處理器以下為輸入數(shù)據(jù)的第一個處理器,可以保證無論幀經(jīng)歷怎樣的粘包拆包,均可以準(zhǔn)確提取每一個自定義幀的數(shù)據(jù)部分。 「博客搬家」 原地址: 簡書 原發(fā)表時間: 2017-03-26 本文采用 Netty 這一最流行的 Java NIO 框架,作為 Java 服務(wù)器通信部分的基礎(chǔ)...
摘要:當(dāng)用戶注銷或退出時,釋放連接,清空對象中的登錄狀態(tài)。聊天管理模塊系統(tǒng)的核心模塊,這部分主要使用框架實(shí)現(xiàn),功能包括信息文件的單條和多條發(fā)送,也支持表情發(fā)送。描述讀取完連接的消息后,對消息進(jìn)行處理。 0.前言 最近一段時間在學(xué)習(xí)Netty網(wǎng)絡(luò)框架,又趁著計算機(jī)網(wǎng)絡(luò)的課程設(shè)計,決定以Netty為核心,以WebSocket為應(yīng)用層通信協(xié)議做一個互聯(lián)網(wǎng)聊天系統(tǒng),整體而言就像微信網(wǎng)頁版一樣,但考慮...
摘要:它使用了事件通知以確定在一組非阻塞套接字中有哪些已經(jīng)就緒能夠進(jìn)行相關(guān)的操作。目前,可以把看作是傳入入站或者傳出出站數(shù)據(jù)的載體。出站事件是未來將會觸發(fā)的某個動作的操作結(jié)果,這些動作包括打開或者關(guān)閉到遠(yuǎn)程節(jié)點(diǎn)的連接將數(shù)據(jù)寫到或者沖刷到套接字。 netty的概念 定義 Netty 是一款異步的事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用程序框架,支持快速地開發(fā)可維護(hù)的高性能的面向協(xié)議的服務(wù)器和客戶端。我們可以很簡單的...
閱讀 4391·2021-11-19 09:59
閱讀 3318·2021-10-12 10:12
閱讀 2630·2021-09-22 15:25
閱讀 3321·2019-08-30 15:55
閱讀 1183·2019-08-29 11:27
閱讀 1463·2019-08-28 18:06
閱讀 2736·2019-08-26 13:41
閱讀 2554·2019-08-26 13:41