Wenn Sie einen Server mit Netty erstellen, möchten Sie möglicherweise FIN und RST ordnungsgemäß verwenden, abhängig von der Situation beim Schließen von Channel (Socket). Beispielsweise besteht die Anforderung, dass FIN (RST bei verzögertem Timeout) normal ist, RST jedoch sofort erkannt wird, wenn eine Abnormalität erkannt wird.
Ob FIN / RST verwendet werden soll, wenn "Channel" geschlossen ist, kann beim Erstellen von "ServerBootstrap" angegeben werden.
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 → Timeout verzögern(10 Sekunden)→ Geben Sie an, dass mit RST geschlossen werden soll
.childHandler(new MyChannelInitializer());
// ...
NOTE:
Die Freigabe durch RST, die> -1 angibt, ist deaktiviert.
Wenn Sie den "ServerBootstrap" auf eine andere Weise als das beim Erstellen angegebene Standardverhalten schließen möchten, können Sie dies tun, indem Sie die "ChannelConfig" aus dem "Channel" abrufen und die Einstellung "SO_LINGER" ändern.
@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); //Geben Sie an, dass RST sofort geschlossen werden soll
ctx.close();
}
}
Recommended Posts