java - Netty IdleStateHandler 的问题——我是不是以错误的方式测试它?

标签 java jboss network-programming netty heartbeat

我有一个玩具 Netty 服务器,当他们的 channel 没有发生任何事情时,我正试图向他们发送心跳消息。我正在通过 telnet 到服务器进行测试,写一条消息然后不发送任何东西,但我没有听到任何心跳!

控制台:

>>telnet localhost 6969
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
>>foo
Did you say 'foo'?

MyPipelineFactory.java

public class MyPipelineFactory implements ChannelPipelineFactory {
    private final Timer timer;
    private static final ChannelHandler stringDecoder = new StringDecoder();
    private static final ChannelHandler stringEncoder = new StringEncoder();
    private final ChannelHandler idleStateHandler;

    public MyPipelineFactory(Timer t) {
        this.timer = t;
        this.idleStateHandler = new IdleStateHandler(timer, 5, 5, 5);
    }

    public ChannelPipeline getPipeline() {
        // create default pipeline from static method
        ChannelPipeline pipeline = Channels.pipeline();
        pipeline.addLast("idleStateHandler", this.idleStateHandler); // heartbeat
        pipeline.addLast("framer", new DelimiterBasedFrameDecoder(1024, Delimiters.lineDelimiter()));
        //pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024,0,1)); // get header from message
        pipeline.addLast("stringDecoder", stringDecoder);
        pipeline.addLast("stringEncoder", stringEncoder);
        pipeline.addLast("ServerHandler", new ServerHandler()); // goes at the end

        return pipeline;
    }
}

心跳处理器.java

public class HeartbeatHandler extends IdleStateAwareChannelHandler {

    @Override
    public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) {
        if (e.getState() == IdleState.READER_IDLE) {
            System.out.println("Reader idle, closing channel");
            //e.getChannel().close();
            e.getChannel().write("heartbeat-reader_idle");
        }
        else if (e.getState() == IdleState.WRITER_IDLE) {
            System.out.println("Writer idle, sending heartbeat");
            e.getChannel().write("heartbeat-writer_idle");
        }
        else if (e.getState() == IdleState.ALL_IDLE) {
            System.out.println("All idle, sending heartbeat");
            e.getChannel().write("heartbeat-all_idle");
        }
    }
}

固定:

我忘记了 HeartbeatHandler,它需要 IdleStateHandler(这部分对我来说并不明显)。行得通。

public class MyPipelineFactory implements ChannelPipelineFactory {
    private final Timer timer;
    private static final ChannelHandler stringDecoder = new StringDecoder();
    private static final ChannelHandler stringEncoder = new StringEncoder();
    private final ChannelHandler idleStateHandler;
    private final ChannelHandler heartbeatHandler;

    public MyPipelineFactory(Timer t) {
        this.timer = t;
        this.idleStateHandler = new IdleStateHandler(timer, 5, 5, 5);
        this.heartbeatHandler = new HeartbeatHandler();
    }

    public ChannelPipeline getPipeline() {
        // create default pipeline from static method
        ChannelPipeline pipeline = Channels.pipeline();
        pipeline.addLast("idleStateHandler", this.idleStateHandler);
        pipeline.addLast("heartbeatHandler", this.heartbeatHandler); // heartbeat
        pipeline.addLast("framer", new DelimiterBasedFrameDecoder(1024, Delimiters.lineDelimiter()));
        //pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024,0,1)); // get header from message
        pipeline.addLast("stringDecoder", stringDecoder);
        pipeline.addLast("stringEncoder", stringEncoder);
        pipeline.addLast("ServerHandler", new ServerHandler()); // goes at the end

        return pipeline;
    }
}

最佳答案

您错过了在 ChannelPipeline 中添加 HeartbeatHandler。您需要将 IdleStateHandler AND HeartbeatHandler 添加到 ChannelPipeline 才能使其正常工作。

关于java - Netty IdleStateHandler 的问题——我是不是以错误的方式测试它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9289595/

相关文章:

java - WildFly 中的 Apache Ignite 数据源

Java POI API - 在 XLS 中绘制饼图

java - 如何在 EAR 项目中使用 wildfly 10 中的 httpcomponents?

apache - WildFly -> Undertow -> 将子域映射到 war 文件不起作用

c - 如何编辑proc文件?

sockets - 如何在非阻塞套接字上设置发送超时?

java - 如何使用java从现有 keystore 生成csr

java - Android:抽屉导航图标

Java - 有一个方法可以将私有(private)字段值传递给另一个类的方法吗?

python - 如何使服务器接受来自多个端口的连接?