自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我們一起聊聊Netty核心模塊

開(kāi)發(fā) 前端
Netty中所有的IO操作都是異步的,不能立刻得知是否被正確處理。但可以給Future和ChannelFuture注冊(cè)一個(gè)監(jiān)聽(tīng),當(dāng)操作執(zhí)行成功或失敗時(shí),會(huì)自動(dòng)觸發(fā)監(jiān)聽(tīng)事件。

1、Bootstrap、ServerBootstrap

  • Bootstrap意思是引導(dǎo),一個(gè)Netty應(yīng)用通道由一個(gè)Bootstrap開(kāi)始,主要作用是配置整個(gè)Netty程序,串聯(lián)各個(gè)組件,Netty中Bootstrap類是服務(wù)端啟動(dòng)引導(dǎo)類。

常用的方法:

public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) 用于服務(wù)器端,設(shè)置兩個(gè)EventLoopGrouppublic B group(EventLoopGroup group) 用于客戶端,設(shè)置一個(gè)EventLoopGrouppublic B channel(Class\ channelClass) 設(shè)置一個(gè)Netty程序的通道實(shí)現(xiàn) public \ B option(ChannelOption\ option, T value) 給ServerChannel添加配置public \ ServerBootstrap childOption(ChannelOption\ childOption, T value) 給接收的通道添加配置public ServerBootstrap childHandler(ChannelHandler childHandler) 設(shè)置業(yè)務(wù)處理類(自定義的Handler)public ChannelFuture bind(int inetPort) 用于服務(wù)器端,設(shè)置綁定的端口號(hào)public ChannelFuture connect(String inetHost, int inetPort) 用于客戶端,用來(lái)連接服務(wù)器

2、Future、ChannelFuture

  • Netty中所有的IO操作都是異步的,不能立刻得知是否被正確處理。但可以給Future和ChannelFuture注冊(cè)一個(gè)監(jiān)聽(tīng),當(dāng)操作執(zhí)行成功或失敗時(shí),會(huì)自動(dòng)觸發(fā)監(jiān)聽(tīng)事件。

常用的方法:

Channel channel() 返回當(dāng)前正在進(jìn)行IO操作的通道 ChannelFuture sync() 等待異步操作執(zhí)行完畢。

3、Channel

  • Netty網(wǎng)絡(luò)通訊組件,能夠用于執(zhí)行網(wǎng)絡(luò)IO操作。
  • 通過(guò)Channel可獲得當(dāng)前網(wǎng)絡(luò)的通道的狀態(tài)。
  • 通過(guò)Channel可獲得網(wǎng)絡(luò)連接的配置參數(shù)。
  • Channel提供異步的網(wǎng)絡(luò)IO操作(如建立連接,讀寫(xiě),綁定端口)。
  • 任何調(diào)用返回一個(gè)ChannelFuture實(shí)例,通過(guò)注冊(cè)監(jiān)聽(tīng)到ChannelFuture上,在IO操作完成時(shí)回調(diào)通知調(diào)用方。
  • 支持關(guān)聯(lián)IO操作與對(duì)應(yīng)的處理程序。
  • 不同協(xié)議、不同的阻塞類型的都有不同的Channel類型與之對(duì)應(yīng),常用的Channel類型:

NioSocketChannel,異步的客戶端TCP Socket連接 NioServerSocketChannel,異步的服務(wù)端TCP Socket連接 NioDatagramChannel,異步的UDP連接 NioSctpChannel,異步的客戶端Sctp連接 NioSctpServerChannel,異步的Sctp服務(wù)器端連接,這些通道涵蓋了UDP和TCP網(wǎng)絡(luò)IO以及文件IO。

4、Selector

Netty基于Selector對(duì)象實(shí)現(xiàn)IO多路復(fù)用,通過(guò)Selector一個(gè)線程可以監(jiān)聽(tīng)多個(gè)連接的Channel事件。

當(dāng)向一個(gè)Selector中注冊(cè)Channel后,Selector內(nèi)部會(huì)輪詢這些Channel是否有已就緒的IO事件(如可讀、可寫(xiě)、網(wǎng)絡(luò)連接完成等),這樣程序就可以很簡(jiǎn)單地使用一個(gè)線程高效管理多個(gè)Channel。

5、ChannelHandler及其實(shí)現(xiàn)類

  • ChannelHandler是一個(gè)接口,處理IO事件或攔截IO操作,并將其轉(zhuǎn)發(fā)到其ChannelPipeline中的下一個(gè)處理程序。
  • ChannelHandler本身并沒(méi)有提供很多方法,使用時(shí)可繼承它的子類。
  • ChannelHandler及其實(shí)現(xiàn)類。

ChannelInboundHandler 用于處理入站IO事件 ChannelOutboundHandler 用于處理出站IO事件。

  • 實(shí)際使用中,經(jīng)常需要自定義Handler類繼承ChannelInboundHandlerAdapter,然后重寫(xiě)相關(guān)方法實(shí)現(xiàn)業(yè)務(wù)邏輯。

public void channelActive(ChannelHandlerContext ctx) 通道就緒事件 public void channelInactive(ChannelHandlerContext ctx) 通道關(guān)閉事件 public void channelRead(ChannelHandlerContext ctx, Object msg) 讀取數(shù)據(jù)事件 public void channelReadComplete(ChannelHandlerContext ctx) 數(shù)據(jù)讀取完畢事件 public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 拋出異常事件。

6、Pipeline和ChannelPipeline

ChannelPipeline是一個(gè)重點(diǎn):

  • ChannelPipeline是一個(gè)Handler的集合,負(fù)責(zé)處理inbound或outbound事件,相當(dāng)于一個(gè)貫穿Netty的職責(zé)鏈。
  • ChannlePipeline實(shí)現(xiàn)了一種高級(jí)形式的攔截過(guò)濾器模式,使用戶可以完全控制事件的處理方式,以及Channel中各個(gè)ChannelHandler如何相互交互。
  • 在Netty中每個(gè)Channel都有且僅有一個(gè)ChannelPipeline與之對(duì)應(yīng),它們的組成關(guān)系如下:

一個(gè)Channel包含了一個(gè)ChannelPipeline,而ChannelPipeline中又維護(hù)了一個(gè)由ChannelHandlerContext組成的雙向鏈表,并且每個(gè)ChannelHandlerContext中又關(guān)聯(lián)著一個(gè)ChannelHander 入站事件和出站事件在一個(gè)雙向鏈表中,入站事件會(huì)從鏈表head往后傳遞到最后一個(gè)入站的handler,出站事件會(huì)從鏈表tail往前傳遞到最前一個(gè)出站的handler,兩種類型的handler互不干擾。

常用方法

ChannelPipeline addLast(ChannelHandler… handlers); 把一個(gè)業(yè)務(wù)處理類(handler)添加到鏈表的第一個(gè)位置 ChannelPipeline addFirst(ChannelHandler… handlers); 把一個(gè)業(yè)務(wù)處理類(handler)添加到鏈表的最后一個(gè)位置。

7、ChannelHandlerContext

保存Channel相關(guān)的所有上下文信息,同時(shí)關(guān)聯(lián)一個(gè)ChannelHandler對(duì)象。

ChannelHandlerContext中包含一個(gè)具體的事件處理器ChannelHandler,同時(shí)也綁定了對(duì)應(yīng)的pipeline和Channel,方便對(duì)ChannelHandler進(jìn)行調(diào)用。

常用方法

ChannelFuture close(); 關(guān)閉當(dāng)前通道 ChannelHandlerContext flush(); 刷新數(shù)據(jù) ChannelFuture writeAndFlush(Object msg); 將數(shù)據(jù)寫(xiě)到ChannelPipeline中,并開(kāi)始出站處理。

8、ChannelOption

Netty在創(chuàng)建Channel實(shí)例后,一般都需要設(shè)置ChannelOption參數(shù)。

ChannelOption參數(shù)如下:

ChannelOption.SO_BACKLOG 對(duì)應(yīng)TCP/IP協(xié)議listen函數(shù)中的backlog參數(shù),用來(lái)初始化服務(wù)器可用隊(duì)列大小。服務(wù)端處理客戶端連接請(qǐng)求是順序處理的ChannelOption.SO_KEEPALIVE 保持連接活動(dòng)狀態(tài)

9、EventLoopGroup和其實(shí)現(xiàn)類NioEventLoopGroup

  • EventLoopGroup是一組EventLoop的抽象,Netty為了更好的利用多核CPU資源,一般會(huì)有多個(gè)EventLoop同時(shí)工作,每個(gè)EventLoop維護(hù)著一個(gè)Selector實(shí)例。
  • EventLoopGroup提供next接口,可以從組里面按照一定的規(guī)則獲取其中一個(gè)EventLoop來(lái)處理任務(wù)。
  • 通常一個(gè)服務(wù)端口即一個(gè)ServerSocketChannel對(duì)應(yīng)一個(gè)Selector和一個(gè)EventLoop線程。BossEventLoop負(fù)責(zé)接收客戶端的連接并將SocketChannel交給WorkerEventLoopGroup來(lái)進(jìn)行IO處理。

BossEventLoopGroup通常是一個(gè)單線程的EventLoop,EventLoop維護(hù)著一個(gè)注冊(cè)了ServerSocketChannel的Selector實(shí)例,BossEventLoop不斷輪詢Selector將連接事件分離出來(lái)。通常是OP_ACCEPT事件,然后將接收到的SocketChannel交給WorkerEventLoopGroupWorkerEventLoopGroup會(huì)由next選擇其中一個(gè)EventLoop來(lái)將這個(gè)SocketChannel注冊(cè)到其維護(hù)的Selector并對(duì)其后續(xù)的IO事件進(jìn)行處理。

常用方法:

public NioEventLoopGroup(int nThreads),構(gòu)造函數(shù),可以指定線程數(shù),如果沒(méi)有指定就是CPU核心數(shù)的兩倍 public Future\ shutdownGracefully() 斷開(kāi)連接,關(guān)閉線程。

10、Unpooled

Netty提供一個(gè)專門(mén)用來(lái)操作緩沖區(qū)(Netty數(shù)據(jù)容器)的工具類。

常用方法:

public static ByteBuf copiedBuffer(CharSequence string, Charset charset)。

public class NettyByteBufTest {
public static void main(String[] args) {
// 創(chuàng)建一個(gè)包含數(shù)組byte[10]的ByteBuf對(duì)象
// Netty的ByteBuf不需要使用filp進(jìn)行反轉(zhuǎn),底層維護(hù)了readInder和writerIndex
// 通過(guò)readerIndex、
ByteBuf buffer = Unpooled.buffer(10);
for (int i = 0; i < 10; i++) {
buffer.writeByte(i);
}
System.out.println("capacity=" + buffer.capacity());
//輸出
for (int i = 0; i < buffer.capacity(); i++) {
System.out.println(buffer.readByte());
}
}
}

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2023-01-04 18:10:26

服務(wù)模塊化jre

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-09-10 21:42:31

2023-06-30 08:18:51

敏捷開(kāi)發(fā)模式

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循環(huán)GolangGo

2023-06-07 14:07:00

架構(gòu)

2022-02-23 08:41:58

NATIPv4IPv6

2022-09-22 08:06:29

計(jì)算機(jī)平板微信

2021-08-12 07:49:24

mysql

2024-11-28 09:57:50

C#事件發(fā)布器

2022-10-08 00:00:05

SQL機(jī)制結(jié)構(gòu)

2024-07-26 09:47:28

2023-03-26 23:47:32

Go內(nèi)存模型

2023-07-24 09:41:08

自動(dòng)駕駛技術(shù)交通

2022-06-26 09:40:55

Django框架服務(wù)

2022-02-14 07:03:31

網(wǎng)站安全MFA

2022-12-07 13:12:15

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)