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

质量好网站建设商家长春制作网站定制

质量好网站建设商家,长春制作网站定制,长沙快速建站模板,手机网站绑定域名Netty框架的底层是NIO,NIO:non-blocking io 非阻塞IO 一个线程可以处理多个通道,减少线程创建数量; 读写非阻塞,节约资源:没有可读/可写数据时,不会发生阻塞导致线程资源的浪费 一…

Netty框架的底层是NIO,NIO:non-blocking io 非阻塞IO

一个线程可以处理多个通道,减少线程创建数量;

读写非阻塞,节约资源:没有可读/可写数据时,不会发生阻塞导致线程资源的浪费

一、NIO三大组件

1.Channel&&Buffer

channel:

读写数据的双向通道,可以从channel将数据读入到buffer,也可以将buffer中的数据写入channel

buffer:

用来暂存数据的缓冲区

常见的channel有:
FileChannel - 文件传输的数据传输通道

DatagramChannel - UDP网络编程时的数据传输通道

SocketChannel - TCP网络编程时的数据传输通道    (客户端、服务器都能用)

ServerSocketChannel - TCP网络编程时的数据传输通道(专用于服务器)

二、Netty

Netty执行流程

Netty核心组件

1.Channel 数据通道:        

数据的载体,建立客户端和服务端通信的桥梁,连接成功后保存Channel通道。

2.EventLoop 与 EventLoopGroup:

Netty为每个Channel分配一个EventLoop,EventLoop 本身只是一个线程驱动,在其生命周期内只会绑定一个线程,让该线程处理一个 Channel 的所有 IO 事件,起到在Channel中处理数据的功能

3.ServerBootstrap 与 Bootstrap:
Bootstrap 是客户端的引导类,Bootstrap 在调用 bind()(连接UDP)和 connect()(连接TCP)方法时,会新创建一个 Channel,仅创建一个单独的、没有父 Channel 的 Channel 来实现所有的网络交换。

​ServerBootstrap 是服务端的引导类,ServerBootstarp 在调用 bind() 方法时会创建一个 ServerChannel 来接受来自客户端的连接,并且该 ServerChannel 管理了多个子 Channel 用于同客户端之间的通信。

Bootstrap来设置一些连接参数

4.ChannelHandler 与 ChannelPipeline:

ChannelHandler是消息处理器,封装在了ChannelPipeline对象中

ChannelPipeline来添加一些特定的处理器满足业务需求

5.ChannelFuture:

 Netty 中所有的 I/O 操作都是异步的,即操作不会立即得到返回结果,所以Netty定义了ChannelFuture来作为操作返回结果

    public Channel connect(String host , int port , ChannelInboundHandlerAdapter  handler, MessageToMessageEncoder encoder, ByteToMessageDecoder decoder) {EventLoopGroup  group = getEventLoopGroup();bootstrap = new Bootstrap();bootstrap.group(group);bootstrap.channel(NioSocketChannel.class);bootstrap.option(ChannelOption.TCP_NODELAY, true);      // 立即发送数据,设置了TCP_NODELAY选项为true,它的作用是禁用了Nagle算法。这意味着数据将被立即发送,不会等待小的数据块进行合并。bootstrap.option(ChannelOption.SO_KEEPALIVE, false);    // 用于控制操作系统是否发送保持活动(keep-alive)探测报文段来检测连接是否仍然活跃bootstrap.option(ChannelOption.ALLOW_HALF_CLOSURE, false);  // 全关闭(Full Closure):表示双方都关闭了连接,不再允许进行数据的读写操作。// 半关闭(Half Closure):表示一端关闭了连接,但另一端仍可以发送数据。// 当设置为true时,表示允许半关闭连接,即当远程端关闭连接时,本地端仍可以继续发送数据。bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000); //连接超时毫秒数bootstrap.option(ChannelOption.SO_RCVBUF, 64 * 1024); //TCP数据接收缓冲区大小bootstrap.option(ChannelOption.SO_SNDBUF, 46 * 1024); //TCP数据发送缓冲区大小// bootstrap.handler(new LoggingHandler(LogLevel.DEBUG));channelInitializer = new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline channelPipeline = ch.pipeline();// channelPipeline.addLast(new LoggingHandler(LogLevel.DEBUG));channelPipeline.addLast("decoder", decoder);channelPipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));channelPipeline.addLast("encoder", encoder);channelPipeline.addLast("handler", handler);}};bootstrap.handler(channelInitializer);try {ChannelFuture channelFuture = bootstrap.connect(host, port).syncUninterruptibly();if (channelFuture != null && channelFuture.isSuccess()) {logger.info("connect tcp server host = {}, port = {} success", host, port);return channelFuture.channel();} else {logger.error("connect tcp server host = {}, port = {} fail", host, port);}} catch (Exception e) {logger.error("connect to tcp server failed.", e);}return null;}

ChannelInboundHandlerAdapterMessageToMessageEncoderByteToMessageDecoder分别是Netty框架中的三个重要类,用于处理网络数据的编解码和处理。

  1. ChannelInboundHandlerAdapter是Netty中用于处理入站数据的抽象类。它提供了一系列的回调方法,可根据实际需求进行重写,用于处理不同的入站事件和操作。通常情况下,我们的自定义处理器需要继承该类,并且实现自定义的业务逻辑。

  2. MessageToMessageEncoder是一个编码器,用于将一种消息类型转换为另一种消息类型。它将一个出站消息对象转换为另一个出站消息对象,例如将一个POJO对象编码为字节数据。通过继承该抽象类并重写encode()方法,我们可以实现自定义的消息编码逻辑,以满足特定的协议或需求。

  3. ByteToMessageDecoder是一个解码器,用于将字节数据解码为其他形式的数据,如将字节数据解码为POJO对象或其他自定义消息对象。它将一个入站的字节缓冲区转换为出站消息对象。通过继承该抽象类并重写decode()方法,我们可以根据实际需求实现自定义的消息解码逻辑,以满足特定的协议或需求。

这三个类在Netty中的应用通常是组合使用的,用于构建完整的网络数据处理链。具体来说,ChannelInboundHandlerAdapter用于处理入站数据的不同事件和操作,MessageToMessageEncoder用于将出站消息对象编码为其他形式的消息对象,而ByteToMessageDecoder用于将入站的字节数据解码为其他形式的消息对象。通过灵活组合和重写这些类的方法,我们可以实现定制的网络数据处理逻辑。

其中ChannelInitializer 是一个用于初始化 SocketChannel 的抽象类。它的 initChannel() 方法会在每个新连接被接受时调用,用于配置该连接的 ChannelPipeline。

在 initChannel() 方法中,我们可以通过 channelPipeline 对象来设置和添加各种处理器(handlers)到 ChannelPipeline 中,以定义数据的处理流程。

在这段代码中,通过 channelPipeline 对象按照一定的顺序添加了以下处理器:

  1. decoder:这是一个 ByteToMessageDecoder,用于将入站的字节数据解码为其他形式的消息对象。
  2. StringDecoder:这是一个 Netty 提供的内置解码器,用于将入站的字节数据解码为字符串形式的消息对象。指定编码格式为 UTF-8
  3. encoder:这是一个 MessageToMessageEncoder,用于将出站消息对象编码为其他形式的消息对象。
  4. handler:这是一个自定义的 ChannelInboundHandlerAdapter,用于处理入站数据的不同事件和操作。

通过这样的方式,我们可以构建一个完整的数据处理流程,根据实际需求来解码、编码和处理网络消息。在 ChannelInitializer 的 initChannel() 方法中,我们可以按照需求自由添加或修改处理器,以满足特定的业务需求。

ChannelFuture channelFuture = bootstrap.connect(host, port).syncUninterruptibly();

这段代码是使用 bootstrap 对象创建一个客户端连接,并返回一个 ChannelFuture 对象。

以下是代码的执行步骤:

  1. bootstrap.connect(host, port):使用指定的主机和端口号,创建一个连接到目标服务器的操作,并返回一个 ChannelFuture 对象。
  2. .syncUninterruptibly():阻塞当前线程,等待连接操作完成。syncUninterruptibly() 方法会阻塞当前线程,直到连接操作完成或发生异常,而不会响应中断。
  3. channelFuture:连接操作完成后,返回一个 ChannelFuture 对象,可以通过该对象获取操作的结果。

通过这段代码,可以同步地创建一个客户端连接,并在连接操作完成后获取连接的 ChannelFuture 对象,以便后续的操作和处理。

http://www.yayakq.cn/news/8138/

相关文章:

  • 响应式网站建设服务器聊城商城网站建设
  • 网页设计与网站建设完全教程wordpress 取一级菜单
  • 郑州好的企业网站建设宣传片拍摄报价
  • 2345浏览器网站大全网络推广工作任务
  • centos 如何建立网站黄骅市长
  • 网站建设 运维 管理农产品网络营销推广方案
  • 注册网站需要实名认证吗做soho的网站
  • 百度推广手机网站网站开发有什么注意的
  • 瑞安哪里有做百度的网站长春关键词排名推广
  • 高端网站开发设计贷款网站源码下载
  • 如何维护自己公司网站西宁做网站是什么
  • 做有色金属哪个网站好wap浏览器在线
  • 南昌简单做网站个人网站建设技术
  • 网站建设合同 文库做网站怎么做小图标
  • 服务器如何发布网站创意设计工作室
  • 长春个人做网站哪家好济南软件外包公司
  • 建设集团网站信息科技公司网站怎么做
  • html5网站制作教程优购网官方网上商城
  • 各大网站创始人开个做网站的公司 知乎
  • 上海创意网站建设云南高风险地区名单最新
  • 做动图素材网站软件如何开发
  • 沈阳哪里有教做网站的扁平化资讯网站模板
  • 扁平化设计的网站东营中移动网站建设
  • 小树建站平台企业网站建设市场分析
  • 安装网站程序网站后端开发
  • 专门做牛肉的网站硬件开发和软件开发的区别
  • 专业网站建站公司网站建设与管理的心得
  • 国外服务器租用网站哪里买到纯净网站模板
  • 中国安能(深圳)建设公司如何做好网站推广优化
  • 做详情页比较好的网站企业网站百度指数多少算竞争大