当前位置: 首页 > news >正文

科技公司网站网页衡阳百度推广公司

科技公司网站网页,衡阳百度推广公司,wordpress搜索标签,政府手机网站模板Netty Netty初体验基础概念Reactor模型传统的阻塞IO模型基础Reactor模型多线程Reactor模型 为什么要使用Netty? (NIO的框架,用于解决高并发出现的问题) *BIO:同步且阻塞的IO NIO:同步且非阻塞的IO(不是说线程&#x…

Netty

  • Netty初体验
  • 基础概念
  • Reactor模型
    • 传统的阻塞IO模型
    • 基础Reactor模型
    • 多线程Reactor模型

为什么要使用Netty?
(NIO的框架,用于解决高并发出现的问题)

在这里插入图片描述

*BIO:同步且阻塞的IO
NIO:同步且非阻塞的IO(不是说线程)
AIO:异步且非阻塞的IO
还没有实现业务,光写整个流程就非常繁琐。NIO除了实现起来复杂之外,还存在一些需要解决的棘手问题,比如客户端断线重连如何实现,心跳处理(客户端在一定的时间内,不断的向服务器发送信息告诉服务器还在)、半包读写处理等等一些列问题,此时需要有这么一个框架,用于解决和优化NIO存在的问题,它就是Netty。

目的:客户端越来越多,随着客户端的增多,代码的复杂程度就变高,netty帮我们降低了编写nio的代码复杂程度*


Netty初体验

第一步:引入依赖

<dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.35.Final</version></dependency>
</dependencies>

服务器端

public class NettyServer {public static void main(String[] args) throws Exception {//创建只处理连接请求的线程组EventLoopGroup bossGroup = new NioEventLoopGroup(10);//创建只处理客户端读写业务的线程组EventLoopGroup workGroup = new NioEventLoopGroup(10);//创建服务端启动对象ServerBootstrap bootstrap = new ServerBootstrap();//配置参数bootstrap.group(bossGroup,workGroup)//使用NioServerSocketChannel作为服务器的通道实现.channel(NioServerSocketChannel.class)//配置用于存放因没有空闲线程导致连接请求被暂存放到队列中的队列长度.option(ChannelOption.SO_BACKLOG,1024)//创建通道初始化的对象并配置该对象,向该对象中添加处理器来实现具体的业务.childHandler(new ChannelInitializer<SocketChannel>() {//初始化通道@Overrideprotected void initChannel(SocketChannel ch) throws Exception {//添加处理器,处理器里面是真正处理业务的ch.pipeline().addLast(new NettyServerHandler());}});//配置groupSystem.out.println("Netty服务器启动了");//同步阻塞地启动服务器ChannelFuture channelFuture = bootstrap.bind(9090).sync();//只要服务没关闭,该方法会一直阻塞channelFuture.channel().closeFuture().sync();System.out.println("================a");bossGroup.shutdownGracefully();workGroup.shutdownGracefully();}
}
public class NettyServerHandler extends ChannelInboundHandlerAdapter {//当有客户端发送数据来的时候该方法就会被调用@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buf = (ByteBuf) msg;System.out.println("客户端发送的数据:"+buf.toString(StandardCharsets.UTF_8));}//读完数据之后调用的方法:发送数据给客户端@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {//创建携带的ByteBuf对象ByteBuf buf = Unpooled.copiedBuffer("hello client".getBytes(StandardCharsets.UTF_8));ctx.writeAndFlush(buf);}//异常捕获@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {System.out.println(cause.getMessage());ctx.close();}
}

客户端

public class NettyClient {public static void main(String[] args) throws Exception {//创建一个线程组用于事件循环EventLoopGroup eventLoopGroup = new NioEventLoopGroup();//创建客户端启动对象Bootstrap bootstrap = new Bootstrap();//设置相关参数bootstrap.group(eventLoopGroup)//使用NioSocketChannel作为客户端的通道实现.channel(NioSocketChannel.class)//创建通道初始化对象并设置handler业务处理器.handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {//添加处理器,处理器里面是实现具体业务的ch.pipeline().addLast(new NettyClientHandler());}});System.out.println("Netty客户端启动了");//告知客户端的服务器的地址,并启动客户端ChannelFuture channelFuture = bootstrap.connect("127.0.0.1",9090).sync();channelFuture.channel().closeFuture().sync();//阻塞等待完成操作后关闭通道eventLoopGroup.shutdownGracefully();}
}
public class NettyClientHandler extends ChannelInboundHandlerAdapter {//当客户端完成连接服务器后调用该方法@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {ByteBuf buf = Unpooled.copiedBuffer("hello server".getBytes(StandardCharsets.UTF_8));ctx.writeAndFlush(buf);}//当通道有读事件发生时调用的方法:读取服务器返回的数据@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buf = (ByteBuf) msg;System.out.println("来自服务器"+ctx.channel().remoteAddress()+"的消息"+buf.toString(StandardCharsets.UTF_8));}
}

基础概念

NIO中实现多路复用的核心类是Selector,当多路复用器Selector调用select方法时,将会查找发生事件的
channel,问题是,该如何在多个注册到selector上的channel中找到哪些channel发生了事件,此时NIO不同的版本有不同的做法。
epoll函数
poll函数
select函数

在这里插入图片描述

Reactor模型

不同的线程决定了程序的性能,多线程是为了充分利用CPU

传统的阻塞IO模型

在这里插入图片描述
客户端连接服务端之后,会等客户端输入完之后,最后响应给客户端,才能紧接着为其它的客户端执行任务,因为等待会耗费大量时间,所以并没有把CPU用到极致

基础Reactor模型

在这里插入图片描述
可以执行完连接之后,让别的客户端来拿来处理自己的任务,各个操作之间是独立的,充分利用服务端之间的性能(可能是连接的,也可以是读的,也可以是写的)

多线程Reactor模型

在这里插入图片描述

http://www.shuangfujiaoyu.com/news/50485.html

相关文章:

  • 深圳龙华网站建设谷歌seo一个月费用需要2万吗
  • 设计创意网站推荐百度推广怎么做的
  • cms网站模板 数据采集关键词搜索排名查询
  • 餐饮网站建设推广百度号码认证平台取消标记
  • 张店网站建设成人零基础学电脑培训班
  • 杭州自适应网站建设信息推广平台
  • 显示佣金的网站是怎么做的外包seo服务口碑好
  • 济阳网站建设公司深圳seo关键词优化外包公司
  • 自助网站模板平台黑帽友情链接
  • vs 2008 建立网站网上销售
  • 磐安网站建设网图识别在线百度
  • 城乡建设网站投稿学大教育培训机构电话
  • 宿松做网站公司网址怎么制作
  • 如何申请企业邮箱流程长春seo招聘
  • 上海做网站那家公司好给企业做网站的公司
  • 杭州二建建设有限公司网站津seo快速排名
  • 专业做公司logo的网站qq群排名优化
  • 开源网站代码竞价推广招聘
  • 网站设计与网站建设a卷人民日报最新头条10条
  • Wordpress图文博客插件宁波超值关键词优化
  • 做网站点击赚取广告费谷歌google中文登录入口
  • 南充网站建设hulingwl旺道智能seo系统
  • 114黄页企业信息查询深圳整站seo
  • wordpress 微信注册aso优化服务平台
  • 做视频网站要申请什么许可证国际新闻直播
  • 自己做网站难不难论文收录网站
  • 创意广告设计培训百度快速优化软件
  • 商务网站建设的主流程活动推广软文范例
  • 网站建设成功案例怎么写seo技术培训海南
  • ag娱乐建设网站app地推接单平台有哪些