当前位置: 首页 > 知识库问答 >
问题:

为什么在客户机被Sigkill杀死时调用服务器上的channelInactive?

米俊晤
2023-03-14

有一个echo服务器和一个echo客户端。当我使用kill-9 杀死客户端进程时,将调用服务器上的channelinactive

EchoServer类


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();
  }
}

共有1个答案

段干麒
2023-03-14

客户端被SIGKILL杀死,因此它应该没有时间主动关闭这个套接字。

客户端应用程序不会主动关闭套接字。如果本地应用程序不再打开套接字,客户端OS内核将隐式关闭该套接字。

 类似资料:
  • 问题内容: 不管我做什么,如果没有立即使用其他PID弹出另一个实例,我似乎都无法杀死Redis -我检查以确保自己正在杀死父进程,并且确实如此。有什么建议么??我已经尝试过重启机器。 问题答案: 弄清楚了!原来当我尝试了这样的SO帖子提供的第二个答案的时候,我做了然后跑了,当我实际上应该跑的时候。我不知道为什么这很重要。

  • 有没有办法使用超时来标记进程?如果进程在30分钟内没有优雅地终止,则该进程应该被标记。理想情况下,这种优雅的关闭应该在后台执行。

  • 我在写一个玩家轮流参加的游戏。在一个回合结束时,我将我的数据发送到服务器,并更新我的数据库,让我知道现在轮到另一个玩家了。问题是,如果有人在中途扼杀了应用程序怎么办?我是说去找任务经理然后杀了它。 编辑:我还应该提到这是在一个片段中,我正在检查这个,但不要认为这会有什么不同。

  • 问题内容: 我试图围绕电子(以前称为Atom Shell)的工作原理进行研究。 我来自一个传统的MVC风格的Web应用程序,在该应用程序中,浏览器通过 路由系统 调用 Controller动作 ,然后Controller从商店(文件系统,数据库等)获取数据并呈现 View ,它被发送回浏览器。某些操作可能会发回JSON,因为它们是通过JavaScript / AJAX调用的,而不是通过浏览器实际导

  • 在我的应用程序中,我有一个在后台(和前台)运行。 在这个中,有一个,当它完成时,我想在某个中启动应用程序并在中自动执行一些操作,即使我的应用程序被杀死或关闭,我也希望它能正常工作。 我看到了一些答案,这是其中之一,但它对我不起作用。我找到了一个更好的解决方案,并将其作为答案发布在下面,但仍然只有在应用程序关闭但未完全关闭时才有效。 如何从后台启动,即使应用程序已关闭或关闭?

  • 我试图将Node.js Socket.io客户机连接到Python/Flask Socket.io服务器。 在服务器(Raspberry Pi)上运行这个项目:pi-gpio-server。这个项目已经有了一个内置的网站,这是一个socket.io客户机来访问Raspberry PI的引脚。整个项目运作良好。 有什么想法吗,为什么我找不到联系?在Flask服务器中有客户机的限制吗?有什么特别的命令