Lors de la construction d'un serveur à l'aide de Netty, vous souhaiterez peut-être utiliser FIN et RST correctement en fonction de la situation lors de la fermeture de Channel (socket). Par exemple, il est nécessaire que FIN (RST en cas de temporisation différée) soit normal, mais RST est immédiatement détecté lorsqu'une anomalie est détectée.
L'utilisation de FIN / RST lorsque Channel est fermé peut être spécifiée lors de la construction de ServerBootstrap.
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(0);
ServerBootstrap bootstrap = new ServerBootstrap()
    .option(ChannelOption.SO_BACKLOG, 1024)
    .group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class)
    .childOption(ChannelOption.SO_LINGER, 10) //FIN → Délai d'expiration(10 secondes)→ Spécifiez pour fermer avec RST
    .childHandler(new MyChannelInitializer());
// ...
NOTE:
La libération par RST qui spécifie> -1 est désactivée.
Si vous voulez fermer le ServerBootstrap d'une manière différente du comportement par défaut spécifié lors de sa construction, vous pouvez le faire en obtenant le ChannelConfig du Channel et en modifiant le paramètre SO_LINGER.
@ChannelHandler.Sharable
class MyHandler extends SimpleChannelInboundHandler<byte[]> {
  @Override
  protected void channelRead0(ChannelHandlerContext ctx, byte[] msg) {
    // ...
  }
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
    ctx.channel().config().setOption(ChannelOption.SO_LINGER, 0); //Spécifiez pour fermer avec RST immédiatement
    ctx.close();
  }
}
        Recommended Posts