Nano Hash - криптовалюты, майнинг, программирование

Почему вызывается channelInactive на сервере, когда клиент убит SIGKILL?

Есть эхо-сервер и эхо-клиент. Когда я использую 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();
  }
}
15.12.2019

Ответы:


1

Клиент убит SIGKILL, поэтому у него не должно быть времени, чтобы активно закрыть этот сокет.

Клиентское приложение активно не закрывает сокет. Ядро клиентской ОС неявно закрывает сокет, если ни одно локальное приложение больше не открывает его.

15.12.2019
  • Спасибо большое! Если клиентский компьютер внезапно выключится, этот сокет не будет закрыт. То есть ситуация, когда клиент убит SIGKILL, отличается от ситуации, когда клиент выключен? 15.12.2019
  • @ZiheLiu: Да, с помощью SIGKILL приложение завершает работу, но ядро ​​ОС все еще работает и может закрыть сокет. При внезапном отключении питания без выключения ОС ОС не сможет правильно закрыть сокет. 15.12.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..