摘要:一個多路復用器可以負責成千上萬的通道,沒有上限。不需要通過對多路復用器對注冊的通道進行輪詢操作即可實現異步讀寫,從而簡化編程模型。同時,支持支持如果是怎么辦最后,到目前位置,支持不支持二無法擴展作為的核心,無法擴展,私有構造函數。
前言
netty 學習 基于 netty in action 5th, 官網資料,網絡博客等
1.1 Why Netty?netty 是一個中間層的抽象
"all problems in computer science can be solved by another
level of indirection"
netty 是一個中間層的抽象,因為底層的網絡編程的各種問題
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 的實現者汲取了 它人實現 FTP, SMTP, HTTP, WebSocket, SPDY and various binary and text-based legacy protocols 中遇到的問題,take great care in its design。并沒有在可擴展,靈活性,穩定性上做出妥協。
2011年Netty 之父離開redhat加入Twitter, 所以redhat、twitter是netty的兩個主要貢獻公司,
netty的許多特性也是眾多大公司項目需求導致的。
zero copy capable rich byte buffer
參考:https://segmentfault.com/a/11...
java io 會涉及到copy,
比如,一個請求有兩個bytebuffer, 分別是請求頭,和請求正文,那么,我們接收請求后的處理是,定義一個大的bytebuffer將這兩個bytebuffer的內容copy到大數組中。
netty可以用CompositeByteBuf,利用一個抽象的邏輯Buffer來避免這個事情。
比如,java 的文件讀寫,我們一般會定義一個小數組,在輸入流和輸出流之間讀寫,這樣就涉及了一次copy.
netty 的FileRegion 利用Java NIO FileChannel.transfer可以避免這個問題。
還有其它的情況。
統一的api
傳統的 Java I/O API 在應對不同的傳輸協議時需要使用不同的類型和方法。比如
java.net.Socket 和 java.net.DatagramSocket 它們并不具有相同的超類型
tcp,udp,ftp...多種協議擴展會很麻煩
bio、nio、aio api 也是不同的
Extensible event module
1.2 Asynchronous by designcallback java
Future
參考:https://www.cnblogs.com/cz123...
FutureTask:
構造函數接收一個Callable對象,這個對象只有一個call 方法,有返回值,會拋出異常。
FutureTask繼承Runnable,說明可以作為一個參數傳到Thread中,其中的run方法,調用的是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做為數據的容器。
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,要注意,一個是堆外內存,適用于頻繁使用的臨時區域
(一般java讀取數據,都是后現將數據從堆內copy一份到堆外,然后再操作)
selector
簡單說,就是Selector會不斷的輪詢注冊在其上的通道(Channel),如果某個通道發生了讀寫操作,這個通道就處于就緒狀態,會被Selector輪詢出來,然后通過SelectionKey可以取得就緒的Channel集合,從而進行后續的IO操作。一個多路復用器(Selector)可以負責成千上萬的通道(Channel),沒有上限。這也是JDK使用了epoll代替傳統的select實現,獲得連接句柄(客戶端)沒有限制。那也就意味著我們只要一個線程負責Selector的輪詢,就可以接入成千上萬個客戶端,這是JDK NIO庫的巨大進步
Nio Vs Aio
nio和aio 區別:在NIO的基礎上引入了異步通道的概念,并提供了異步文件和異步套接字通道的實現,從而在真正意義上實現了異步非阻塞,之前的NIO只是非阻塞而并非異步。AIO不需要通過對多路復用器對注冊的通道進行輪詢操作即可實現異步讀寫,從而簡化NIO編程模型。
1、nio 是圍繞selector,selector上注冊的serversocketchannel,socketchannel,及確定的注冊事件。
2、aio 簡化了nio操作,當一個event(Accept,Connect,read,write)發生時,CompletionHandler會處理,使得用戶專注于業務邏輯。
一、Nio 依賴底層的操作系統,有跨平臺問題。
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.
二、無法擴展
作為nio的核心,bytebuffer 無法擴展,私有構造函數。netty 實現了自己的bytebuffer.
三、NIO對緩沖區的聚合和分散操作可能會操作內存泄露
四、 epoll bug
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71776.html
摘要:操作指引該文件服務組件的使用需要分為兩個部分,一個是服務端配置與啟動,一個是客戶端的配置與啟動。在調用文件服務返回的路徑的時候,需要用到服務端訪問文件的地址,進而訪問相應的文件內容。 本文所述文件服務組件在筆者此前一篇文章中已有闡述(基于netty的文件上傳下載組件),不過本文將基于之前這個實現再次進行升級改造,利用基于注解的方式進行自動裝配。 1. 簡介 1.1 Netty簡介 Ne...
摘要:完成客戶端服務器通信,需要基于協議之上,自定義一套簡單的通信協議,其中數據交換方式需要使用自定義幀。輸入數據處理器以下為輸入數據的第一個處理器,可以保證無論幀經歷怎樣的粘包拆包,均可以準確提取每一個自定義幀的數據部分。 「博客搬家」 原地址: 簡書 原發表時間: 2017-03-26 本文采用 Netty 這一最流行的 Java NIO 框架,作為 Java 服務器通信部分的基礎...
摘要:當用戶注銷或退出時,釋放連接,清空對象中的登錄狀態。聊天管理模塊系統的核心模塊,這部分主要使用框架實現,功能包括信息文件的單條和多條發送,也支持表情發送。描述讀取完連接的消息后,對消息進行處理。 0.前言 最近一段時間在學習Netty網絡框架,又趁著計算機網絡的課程設計,決定以Netty為核心,以WebSocket為應用層通信協議做一個互聯網聊天系統,整體而言就像微信網頁版一樣,但考慮...
摘要:它使用了事件通知以確定在一組非阻塞套接字中有哪些已經就緒能夠進行相關的操作。目前,可以把看作是傳入入站或者傳出出站數據的載體。出站事件是未來將會觸發的某個動作的操作結果,這些動作包括打開或者關閉到遠程節點的連接將數據寫到或者沖刷到套接字。 netty的概念 定義 Netty 是一款異步的事件驅動的網絡應用程序框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端。我們可以很簡單的...
閱讀 4418·2021-11-19 09:59
閱讀 3335·2021-10-12 10:12
閱讀 2646·2021-09-22 15:25
閱讀 3349·2019-08-30 15:55
閱讀 1194·2019-08-29 11:27
閱讀 1473·2019-08-28 18:06
閱讀 2747·2019-08-26 13:41
閱讀 2564·2019-08-26 13:41