Netty设置option警告Unknown channel option

本文探讨了在使用Netty 4.1.36.Final和JDK 1.8时遇到的'Unknown channel option'警告。关键区别在于option应用于ServerChannel,而childOption应用于ServerChannel的子Channel。当在不恰当的地方设置选项时,可能会引发警告。通过查阅API文档和分析不同Netty版本的行为,可以了解哪些ChannelOptions适用于特定的ChannelConfig,从而避免警告。

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

本文使用环境版本是
netty 4.1.36.Final
jdk 1.8

经查,问题的关键点事childOption和option的问题,找了几个答案如下:

option主要是设置的ServerChannel的一些选项,而childOption主要是设置的ServerChannel的子Channel的选项。 如果是Bootstrap的话,只会有option而没有childOption,所以设置的是客户端Channel的选项。

option主要是针对boss线程组,child主要是针对worker线程组

The parameters that we set using ServerBootStrap.option apply to the ChannelConfig of a newly created ServerChannel, i.e., the server socket which listens for and accepts the client connections.
These options will be set on the Server Channel when bind() or connect() method is called. This channel is one per server.
And the ServerBootStrap.childOption applies to to a channel’s channelConfig which gets created once the serverChannel accepts a client connection.
This channel is per client (or per client socket).
So ServerBootStrap.option parameters apply to the server socket (Server channel) that is listening for connections and ServerBootStrap.
childOption parameters apply to the socket that gets created once the connection is accepted by the server socket.
The same can be extended to attr vs childAttr and handler vs childHandler methods in the ServerBootstrap class.
How could I know which option should be an option and which should be a childOption ?Which ChannelOptions are supported depends on the channel type we are using.
You can refer to the API docs for the ChannelConfig that you’re using.
netty.io/4.0/api/io/netty/channel/ChannelConfig.html
and its sub classes. You should find Available Options section for each ChannelConfig.

在设置netty服务端的option时,设置了如下参数。

server.group(boss,worker)//设置时间循环对象,前者用来处理accept事件,后者用于处理已经建立的连接的io
                //Server是NioServerSocketChannel 客户端是NioSocketChannel绑定了jdk NIO创建的ServerSocketChannel对象,
                //用它来建立新accept的连接
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG,1024)//
                // 第2次握手服务端向客户端发送请求确认,同时把此连接放入队列A中,
                // 然后客户端接受到服务端返回的请求后,再次向服务端发送请求,表示准备完毕,此时服务端收到请求,把这个连接从队列A移动到队列B中,
                // 此时A+B的总数,不能超过SO_BACKLOG的数值,满了之后无法建立新的TCP连接,2次握手后和3次握手后的总数
                // 当服务端从队列B中按照FIFO的原则获取到连接并且建立连接[ServerSocket.accept()]后,B中对应的连接会被移除,这样A+B的数值就会变小
                //此参数对于程序的连接数没影响,会影响正在准备建立连接的握手。
                .option(ChannelOption.SO_KEEPALIVE,true)
                //启用心跳,双方TCP套接字建立连接后(即都进入ESTABLISHED状态),
                // 并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活,TCP会自动发送一个活动探测数据报文
                .option(ChannelOption.TCP_NODELAY,true)
                //TCP协议中,TCP总是希望每次发送的数据足够大,避免网络中充满了小数据块。
                // Nagle算法就是为了尽可能的发送大数据快。
                // TCP_NODELAY就是控制是否启用Nagle算法。
                // 如果要求高实时性&#x
### Netty 数据接收原理 Netty 是一种基于 Java NIO 的高性能网络通信框架,其核心组件之一是 `Channel` 和 `Handler`。通过这些组件,Netty 能够高效地完成数据的接收、解码以及后续处理。 #### 接收数据的核心流程 Netty 使用事件驱动模型来管理 I/O 操作,在接收到网络数据时会触发一系列回调函数。以下是主要过程: 1. **绑定监听端口** 首先创建一个服务端通道(如 `NioServerSocketChannel`),并将其绑定到指定的 IP 地址和端口号[^2]。 2. **注册事件处理器** 将自定义的业务逻辑封装成 Handler 并添加到 ChannelPipeline 中。这样当有新连接建立或者数据到达时,对应的 handler 方法会被调用[^1]。 3. **读取字节流** 当客户端发送消息过来之后,服务器端会利用底层操作系统的缓冲区机制把原始二进制形式的数据填充至 ByteBuf 对象里等待进一步加工转换[^3]。 4. **编解码阶段** 如果传输的是复杂结构化对象而非简单字符串,则通常还需要经历编码/解码环节。例如下面展示了一个重写的 decode 函数片段用于区分不同类型的消息体内容: ```java @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { try { byte[] body = new byte[in.readableBytes()]; in.readBytes(body); MessageData messageData = (MessageData) ProtostuffUtils.deserialize(body, clazz); if (messageData.getData_type() == MessageData.DataType.CarHeartBeat){ out.add(messageData.getCarHeartBeat()); } else { out.add(messageData.getComputeResult()); } } catch (Exception e) { e.printStackTrace(); } } ``` 上述代码实现了根据不同类型字段 (`data_type`) 来决定最终放入集合中的具体实例是什么样子的东西——要么是一个心跳包要么就是计算结果返回值。 5. **分发给应用层处理** 最后一步便是将已经经过初步解析后的实体交给更高级别的模块去做更加深入细致的工作比如存储数据库查询索引等等。 --- ### 示例代码及其解释 以下提供了一套完整的示例程序说明如何配置 netty server 来接受来自远程设备的心跳信号或者其他请求命令: ```java public class MyServerInitializer extends ChannelInitializer<SocketChannel> { private final Class<?> clazz; public MyServerInitializer(Class<?> clazz) { this.clazz = clazz; } @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); // 添加帧解码器防止粘包拆包现象发生 pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4)); // 自定义解码器负责反序列化工作 pipeline.addLast(new ProtoStuffDecoder(clazz)); // 定义好怎么去响应各类不同的输入源 pipeline.addLast(new SimpleChannelInboundHandler<MessageData>() { @Override protected void channelRead0(ChannelHandlerContext ctx, MessageData msg) throws Exception { switch(msg.getData_type()){ case CarHeartBeat: System.out.println("Received car heartbeat: "+msg.getCarHeartBeat().toString()); break; default: System.out.println("Unknown data type received."); } // 可选回复确认信息回去告诉对方我们收到了他们的报文 ctx.writeAndFlush(Unpooled.copiedBuffer("OK".getBytes())); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); } }); } } // 启动入口类 public class ServerBootstrapExample { static final int PORT = Integer.parseInt(System.getProperty("port", "8080")); public static void main(String[] args) throws InterruptedException { EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 主线程组只用来接受新的连接 EventLoopGroup workerGroup = new NioEventLoopGroup(); // 工作线程池实际执行I/O任务 try{ ServerBootstrap b = new ServerBootstrap() .group(bossGroup,workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new MyServerInitializer(MessageData.class)) .option(ChannelOption.SO_BACKLOG,128) .childOption(ChannelOption.SO_KEEPALIVE,true); ChannelFuture f = b.bind(PORT).sync(); f.channel().closeFuture().sync(); }finally{ bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } } ``` 此段脚本展示了怎样构建起一套基本的服务架构以便于持续监控车辆状态变化情况的同时也能够灵活应对其他种类的需求到来。 ---
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值