Netty 4.1.106.Final 发布


我们很高兴地宣布 netty 4.1.106.Final 发布。我们决定对 4.1.105.Final 进行快速后续发布,因为有人刚刚发现了一个HTTP2 错误 (#13786),当发送大量标头时,该错误可能会导致损坏。这个错误已经存在很长时间了,但直到本周才被发现。
最重要的变化是:

  • HTTP2:防止共享连续帧头ByteBuf的索引。( #13786 ):
  • DnsNameResolver:如果 id 空间耗尽则查询失败 ( #13784 )
  • 短路 ByteBuf::release ( #13782 )

背景
Netty 是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和简化了网络编程,例如 TCP 和 UDP 套接字服务器。

DISCARD协议:
需要做的是忽略所有收到的数据。让我们直接从处理程序实现开始,它处理 Netty 生成的 I/O 事件。

package io.netty.example.discard;

import io.netty.buffer.ByteBuf;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 * Handles a server-side channel.
 */

public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
// (1)

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
// (2)
       
// Discard the received data silently.
        ((ByteBuf) msg).release();
// (3)
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
// (4)
       
// Close the connection when an exception is raised.
        cause.printStackTrace();
        ctx.close();
    }
}

DiscardServerHandler 扩展了 ChannelInboundHandlerAdapter,它是 ChannelInboundHandler 的实现。ChannelInboundHandler 提供了各种事件处理方法,你可以覆盖这些方法。目前,只需扩展 ChannelInboundHandlerAdapter,而不必自己实现处理程序接口。

我们在此覆盖 channelRead() 事件处理方法。每当从客户端接收到新数据时,就会调用该方法,同时调用接收到的消息。在本例中,接收到的信息类型是 ByteBuf。

为了执行 DISCARD 协议,处理程序必须忽略接收到的消息。ByteBuf 是一个引用计数对象,必须通过 release() 方法显式释放。请记住,处理程序有责任释放传递给处理程序的任何引用计数对象。通常,channelRead() 处理程序方法的实现如下:

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
    try {
        // Do something with msg
    } finally {
        ReferenceCountUtil.release(msg);
    }
}

当 Netty 因 I/O 错误或处理程序在处理事件时抛出异常而引发异常时,就会调用带有 Throwable 的 exceptionCaught() 事件处理方法。在大多数情况下,捕获的异常应该被记录下来,其相关的通道也应该在此关闭。例如,您可能想在关闭连接前发送一条带有错误代码的响应消息。