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

Netty服务器在本地运行时不能正确关闭

沈栋
2023-03-14

我在同一个jvm中运行Netty客户端和服务器并试图停止服务器时遇到问题。以下是我的代码来举例说明:

@BeforeMethod
public void setUp() {
    serverBootstrap = new ServerBootstrap(new DefaultLocalServerChannelFactory());
    serverBootstrap.getPipeline().addLast("my-server-handler", new ServerHandler());
    LocalAddress local = new LocalAddress("1");
    serverChannel = serverBootstrap.bind(local);

    clientBootstrap = new ClientBootstrap(new DefaultLocalClientChannelFactory());

    clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
        @Override
        public ChannelPipeline getPipeline() throws Exception {
            ChannelPipeline pipeline = Channels.pipeline();
            pipeline.addLast("my-client-handler", new ClientHandler());
            return pipeline;
        }
    });

    ChannelFuture future = clientBootstrap.connect(local);
    if (future.isSuccess())
        System.out.println("Client connected");
    clientChannel = future.getChannel();
}

@AfterMethod
public void tearDown() {
    closeServer();
    clientChannel.close().awaitUninterruptibly();
    clientBootstrap.releaseExternalResources();
}

@Test
public void shoulClose() {        
    sendData();
    closeServer();
    sendData();       
}

private void closeServer() {
    serverChannel.close().awaitUninterruptibly();
    serverBootstrap.releaseExternalResources();
}

private void sendData() {
    clientChannel.write(new byte[] { 1, 2, 3 });
}

我已经用Netty 3.4.0测试过了。最终和3.4.4。最后,我不知道我做错了什么。

为什么在服务器关闭后,客户端仍然可以向服务器发送数据?

共有1个答案

饶谦
2023-03-14

客户端可以发送数据,但不支持客户端通道的未来。写(…)应该失败。

您可以通过以下方式进行检查:

boolean success = clientChannel.write(new byte[] { 1, 2, 3 }).awaitUninteruptable().isSucess();

或者使用ChannelFutureListener以异步方式获取通知。

 类似资料:
  • 我试图了解gRPC中的异常处理机制是如何工作的。 除了try-catch块之外,还有其他方法来处理运行时异常,例如服务器端的IllegalArgumentException吗? 例如,我有一些gRPC流式客户端服务,当传递的参数不满足深层次的一些断言时(在某些库中,例如,com.google.common.base.Preconditions),方法onNext抛出IllegalArgumentE

  • 嗨,我已经在CentOS 7上安装了wine(版本wine-3.0.2)来运行我的。vbs文件。但在运行时,它得到了以下错误。 你能帮我修一下这个吗。我对此不太了解

  • 我正在开发一个android和iOS应用程序,需要有一个RESTful服务器端。直到今天,我在eclipse上使用Jersey和RunJettyRun,但我决定开始使用新的更好的东西!我搬到了DropWizard和IntelliJ IDEA 这些是我安装的软件和我已经处理的事情:-Java 8-Maven 3.1.1-Maven和Java的环境变量。 现在,我所做的是跟随他们网站上的DropWiz

  • 问题内容: 我正在调试一些必须在我的虚拟机上运行的python脚本。而且,我更喜欢在本地(虚拟机外部)编辑脚本。因此,我发现每次都将脚本修改为虚拟机 很繁琐。谁能提出一些有效的方法? 特别是,我想知道是否可以在远程PVM上执行python脚本。像这样: 问题答案: 可以使用ssh。Python接受连字符(-)作为执行标准输入的参数, 运行 python –help 以获得更多信息。

  • 我一直在尝试使用mongodb shell,但服务器无法运行,我使用命令提示符导航到cd C:\ProgramFiles\mongodb\server\4.4\bin,然后,我在C:\Data\db上创建了目录,尝试启动mongod命令,但我得到了以下错误: null

  • Grpc服务器似乎是使用Netty实现的。是否有使用其他实现的方法?