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