netty入门三netty扫盲

本文介绍了Netty框架的基础组件,如ServerBootstrap、NioEventLoopGroup、ChannelInitializer、ChannelPipeline和ChannelHandler,以及如何解决NIO编程中的复杂问题。通过实例展示如何创建一个简单的Netty服务器,包括配置、线程模型和API应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.netty概述

Netty是由JBOSS提供的一个java开源框架,基于NIO的客户、服务器端的编程框架。

Netty实现的协议包括FTP、HTTP、SMTP、WEBSOCKET等待

Netty解决了NIO编程的复杂的线程模型,以及断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流处理的问题,Epoll空轮询导致的CPU飙升100%

2.netty核心组件

  • ServerBootstrap 启动类

  •  NioEventLoopGroup 线程组 持有多个NioEventLoop

  • NioEventLoop 其实就是一个reactor内部会维护一个selector和线程组

  •  ChannelInitializer channel初始化器

  • NioSocketChannel netty提供的封装了java NIO相关API的对象

SocketChannel API同ChannelHandler一样非常庞大,最终继承自AbstractChannel并实现了Channel接口(即ChannelInitializer的泛型)

  • ChannelPipeline

一个管理ChannelHandler的流水线,提供一系列的对ChannelHandler进行CRUD的链表方法

下图引用自netty.ChannelPieline源码

  • ChannelHandler netty提供的用于从SocketChannel读写数据的执行器

  •  ChannelOption 一些常量配置
  •  ChannelFuture 用于异步关闭channel 

参考如下代码:用于异步关闭channel

ChannelFuture channelFuture = bootstrap.bind().sync();
channelFuture.channel().closeFuture().sync();

3.Netty线程模型

4.Netty API简单使用示例

package cn.qu.netty.web;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;

public class NettyServer {

	final static Log log = Log.createLog();

	public static NettyServer createNettyServer() {
		NettyServer nettyServer = new NettyServer();
		return nettyServer;
	}

	/**
	 * @Description:
	 * @param port
	 * @param queueSize netty 线程组中的队列最大容量
	 * @throws InterruptedException
	 */
	public void start(int port, int queueSize, String[] scannerPackage) throws Exception {
		NioEventLoopGroup bossGroup = null;
		NioEventLoopGroup workerGroup = null;
		ApplicationContext applicationContext = new ApplicationContext(scannerPackage);
		HandlerMappingProvider handlerMappingProvider = new HandlerMappingProvider(applicationContext);
		FilterProvider filterProvider = new FilterProvider(applicationContext);
		try {
			ServerBootstrap bootstrap = new ServerBootstrap();
			bossGroup = new NioEventLoopGroup(1);
			workerGroup = new NioEventLoopGroup();
			ChannelFuture channelFuture = bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
					.option(ChannelOption.SO_BACKLOG, queueSize).childHandler(new ChannelInitializer<SocketChannel>() {
						@Override
						protected void initChannel(SocketChannel ch) throws Exception {
							ch.pipeline().addLast(new HttpServerCodec())
									.addLast(new HttpObjectAggregator(64 * 1024)) // 最大5mb
									// .addLast(new CheckIpInboundHandler()) 抽象到过滤器
									.addLast(new DefaultHandler(filterProvider, handlerMappingProvider));
						}
					}).bind(port).sync();
			log.log("netty server start success : port=" + port);
			channelFuture.channel().closeFuture().sync();
		} finally {
			bossGroup.shutdownGracefully();
			workerGroup.shutdownGracefully();
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值