Netty中的内置通信模式、Bootstrap和ChannelInitializer

内置通信传输模式

  • NIO:io.netty.channel.socket.nio 使用java.nio.channels包作为基础–基于选择器的方式
  • Epoll:io.netty.channel.epoll由JNI驱动的epoll()和非阻塞IO.这个传输支持只有在Linux上可用的多种特性,如果SO_REUSEPORT,比NIO传输更快,而且是完全非阻塞的。将NioEventLoopGroup替换为
    EpollEventLoopGroup,并且将NioServerSocketChannel.class替换为EpoolServerSocketChannel.class即可
  • OIO:io.netty.channel.socket.oio使用java.net包作为基础–使用阻塞流
  • Local:io.netty.channel.local可以在VM内部通过管道进行通信的本地传输
  • Embedded:io.netty.channel.embedded Embedded传输,允许使用ChannelHandler而又
    不需要一个真正的基于网络的传输,在测试ChannelHandler实现时非常有用

引导 Bootstrap

Bootstrap是Netty框架的启动类和主入口类,分为客户端类Bootstrap和服务器类ServerBootstrap两种。
网络编程里,"服务器"和"客户端"实际上表示了不同的网络行为:换句话说,是监听传入的连接还是建立到一个或者多个进程的连接。
因此,有两种类型的引导:一种用于客户端(简单地称为Bootstrap),而另一种(ServerBootstrap)用于服务器。无论应用程序使用哪种协议或者处理哪种类型地数据,唯一决定它使用哪种引导类的是它是作为一个客户端还是作为一个服务器
在这里插入图片描述
ServerBootstrap和Bootstrap
ServerBootstrap将绑定到一个端口,因为服务器必须要监听连接,而Bootstrap则是由
想要连接到远程节点的客户端应用程序所使用的.第二个区别可能更加明显。引导一个客户端只需要一个EventLoopGroup,但是一个ServerBootstrap则需要两个(也可以是同一个实例),因为服务器需要两组不同的Channel,第一组将只包含一个ServerChannel,代表服务器自身的已绑定到某个本地端口的正在监听的套接字。而第二组将包含所有已创建的用来传入客户端连接(对于每个服务器已经接受的连接都有一个)的Channel.与ServerChannel相关联的EventLoopGroup将分配一个负责为传入连接请求创建Channel的EventLoop。一旦连接被接受,第二个EventLoopGroup就会给它的Channel分配一个EventLoop
在这里插入图片描述

ChannelInitializer

负责初始化Channel.Netty提供了一个特殊的ChannelInboundHandlerAdapater子类:它定义了
下面的方法:
protected abstract void initChannel(C ch) throws Exception;
这个方法提供了一种将多个ChannelHandler添加到一个ChannelPipeline中的简便方法,你只需要
简单地向Bootstrap或者ServerBootstrap的实例提供你的ChannelInitializer实现即可,并且一旦
Channel被注册到了它的EventLoop之后,就会调用你的initChannel()版本。在该方法返回之后,
ChannelInitializer的实例将会从ChannelPipeline中移除它自己,所以,在我们自己的应用程序中,
如果存在着某个Handler只使用一次的情况,也可以伪造Channelinitializer,用完以后将自己从ChannelPipeline中移除自己,比如授权Handler,某客户端第一次连接登录以后,进行授权检查,检查通过后,就可以把这个

在这里插入图片描述

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Netty 实现 Socket 通信解码需要使用到 Netty 的解码器。Netty 提供了一系列的解码器,可以根据不同的传输协议进行解码。其常用的有以下几种: 1. ByteToMessageDecoder:将字节流解码成消息对象。该解码器可以处理分包和粘包问题。 2. LengthFieldBasedFrameDecoder:根据消息的长度进行解码,可以处理粘包和分包问题。 3. LineBasedFrameDecoder:按行分割文本,通常用于处理文本协议。 4. DelimiterBasedFrameDecoder:按照指定的分隔符进行分割,通常也用于处理文本协议。 以下是一个使用 ByteToMessageDecoder 的示例代码,假设我们要将字节流解码成一个自定义的 Message 对象: ```java public class MessageDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (in.readableBytes() < 4) { // 如果可读字节数小于 4,则返回等待更多数据 return; } // 读取消息长度 int length = in.readInt(); if (in.readableBytes() < length) { // 如果可读字节数小于消息长度,则返回等待更多数据 in.resetReaderIndex(); return; } // 读取消息内容 byte[] content = new byte[length]; in.readBytes(content); // 将消息解码成 Message 对象,并添加到输出列表 Message message = decodeMessage(content); out.add(message); } private Message decodeMessage(byte[] content) { // 自定义消息解码逻辑 return null; } } ``` 在上述代码,我们继承了 ByteToMessageDecoder,重写了 decode 方法。该方法会在每次读取到数据时被调用,我们在该方法进行解码操作,并将解码后的消息添加到输出列表。在解码过程,我们先读取消息的长度,再根据长度读取消息内容,最后将消息内容解码成 Message 对象。需要注意的是,由于 Netty 采用了零拷贝技术,我们无需手动释放 ByteBuf 对象,Netty 会自动释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_babe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值