当前位置: 首页 > 面试题库 >

Netty IdleStateHandler出现问题-我是否以错误的方式对其进行了测试?

邰博远
2023-03-14
问题内容

我有一个玩具Netty服务器,并且尝试在客户端的通道未发生任何事件时向其发送心跳消息。我正在通过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;
    }
}

HeartbeatHandler.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
HeartbeatHandler 添加到ChannelPipeline才能正常工作。



 类似资料:
  • 所以我肯定有类似的东西在那里,但我已经搜索了一个小时,还没有找到确切的我要找的东西。假设我有一个这样的类: 我该如何制作这样的作品?

  • 我有Byte Buddy作为代理运行,它成功地拦截了我的绝大多数代码库,顺便说一下,这是相当大的!虽然有几个异常值,我不能测量,我在下面记录,希望你能知道答案! 1.CGLIB生成的类 Spring生成了一些额外的类,它们与我的类同名,但在末尾附加了,这些会导致错误。我得到的错误是: 2.打包私密类和私密类 我看到的另一个问题是检测或。 代码如下所示: Byte Buddy instrument或

  • 我的方向是编写一个代码(在java中),找到1,000到9,999(任何4位数字)之间的代码,满足四个条件: 这四个数字都不一样 千位数字是十位数字的3倍 这个数字是奇数 数字之和是27 这就是我目前所拥有的。我的部分出现错误: 是出现的错误。 在我的脑海里,

  • 我从字符串标记器开始,它给我正确的结果,直到我收到上面的字符串作为输入。 此字符串的特殊之处在于,它在几个管道之间没有任何字符,例如和 当我试图用标记器拆分它时,它给我的标记比我预期的要少,它只是忽略了空字符,结果是我给phoneNumber分配了1257值,给RegionCode分配了InsertDaate值。 null

  • 在这里输入图像描述非常简单的问题,但在网站上显示运行时错误(初学者顺便说一句)。不太确定错误,但我认为输入部分不正确(从输入中获取多个字符串)。还有其他方法可以获取字符串数组的输入吗?如果有,请告诉我。