Есть эхо-сервер и эхо-клиент. Когда я использую kill -9 <client_pid>
для уничтожения клиентского процесса, вызывается channelInactive
на сервере.
Клиент убит SIGKILL
, поэтому у него не должно быть времени, чтобы активно закрыть этот сокет. В результате channelInactive
на сервере не должно было срабатывать, что и произошло.
Почему channelInactive
на сервере вызывается, когда клиент убит SIGKILL
?
Класс эхосервера
public class EchoServer {
private final int port;
public EchoServer(int port) {
this.port = port;
}
public static void main(String[] args) throws InterruptedException {
int port = 9001;
new EchoServer(port).start();
}
public void start() throws InterruptedException {
EventLoopGroup group = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap
.group(group)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline()
.addLast(new ChannelInboundHandlerAdapter() {
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
System.out.println("channelInactive()");
}
});
}
});
ChannelFuture future = bootstrap.bind(new InetSocketAddress(port)).sync();
future.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
}
}
Класс EchoClient
public class EchoClient {
private final String host;
private final int port;
public EchoClient(String host, int port) {
this.host = host;
this.port = port;
}
public void start() throws InterruptedException {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap
.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
}
});
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port)).sync();
future.channel().closeFuture().sync();
} finally {
group.shutdownGracefully().sync();
}
}
public static void main(String[] args) throws InterruptedException {
new EchoClient("localhost", 9001).start();
}
}