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

Netty中的消息处理

满伟彦
2023-03-14

我是Netty的新手,需要以自定义方式处理消息。我有以下接口:

public interface Command{ }

public interface CommandFactory{
    Command(byte b)
}

public interface CommandProcessor{
    void process(Command c, Object arg)
}

现在我从客户端收到一些数据,并希望对其进行处理。我正在实现ReplayingDecoder

public class CommandDecoder extends ReplayingDecoder<Void>{
    private CommandFactory cmf;
    private CommandProcessor cmp;

   void decode(ChannelHandlerContext ctx, ByteBuf in, List<AnyRef> out){
       Command command = cmf.command (
         in.readByte()
       );

       String arg = new String (
         in.readBytes (
           in.readShort()
         ).array()
       );

      cmp.process(command, arg); //<------------ Here
  }
}

问题是我不确定。我在解码器中处理命令。至少可以说看起来很奇怪。也许我应该通过解码的通信arg进一步到通道管道

但是,要选择哪个ChannelInundHandler用于命令处理?


共有1个答案

通飞尘
2023-03-14

你是对的。最好将解码器和实际业务逻辑分离,以便进行命令处理。在这种情况下,最好的处理程序是SimpleChannelInboundHandler。通常,它只接受特定类型的消息。

可能是这样的:

public class MyCommandHandler extends SimpleChannelInboundHandler<Command> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Command command) throws Exception {
         //process here your message
         //command.type;
         //command.args  
    }

}

因此,在您解码命令之后:

Command command = cmf.command (
         in.readByte(),
         new String (in.readBytes (in.readShort()).array())
       );

您可以通过以下方式将其传递到管道中的下一个MyCommandHandler

out.add(command);
 类似资料:
  • 我正在使用netty构建一个应用程序。在应用程序中,我需要处理传入和传出的消息。要求是应用程序将发送的任何消息都应由特定的处理程序处理,进入应用程序的任何消息都应由另一个特定的处理程序处理。但是,我希望在两个处理程序之间交换消息,以便能够跟踪发送的消息响应,因为请求消息也将发送到应用程序。 请任何想法hwo实施这样的要求。这个问题听起来可能不相关,但这就是我得到的,我还不是一个网络极客。我读到的关

  • 我有一个Netty4.x应用程序,它需要发送和接收ASCII消息,从一个固定长度(10位数,零填充)字段开始,包含以#字符为单位的消息大小。消息如下:

  • 我刚刚开始学习Netty,想慢慢来真正理解它是如何工作的。我有一个基于独立套接字测试程序的初始用例: 从客户端连接到服务器时,立即发送消息并处理响应 很简单...或者我是这么想的。我已经看了好几天了,不太明白为什么它的表现不如预期。 这是最初的测试程序,它再次简单地连接到远程服务器,并立即向服务器写入字节缓冲区。然后服务器立即发送一个ack响应,该响应被写入控制台。 我用Netty做了同样的测试,

  • 问题内容: 我正在尝试使用Netty迈出第一步,为此目的,我在Netty上编写了简单的服务器,在oio纯TCP上编写了简单的客户端。 客户端发送随机文本数据包,并且必须接收“ Ack”消息。请参阅处理程序方法: 问题是-当我尝试发送回“ Ack”字符串时-客户端什么也没收到。但是,当我尝试发送回来的消息时,它工作正常,并且我在客户端看到回显。 方法需要,我尝试发送-但没有任何反应。我也尝试发送(我

  • 我正在尝试实现分布式参与者模型,该模型使用Netty作为通信协议——具有TCP连接的NIO版本。 假设我们有2个节点(机器),每个节点都有Netty的服务器实例,它们将传入的消息传递给该节点上的参与者。我希望为同一对远程参与者保持消息顺序,因此我的解决方案是使用异步writeAndFlush方法将消息发送到远程节点和参与者-当在第一条消息交付之前需要向同一参与者发送另一条消息时,我会将其添加到缓冲

  • 我编写了一个基于Netty4的REST服务器。客户端处理程序如下所示。 netty提供的msg中的bytebuffer容量各不相同。当客户端消息大于缓冲区时,消息将被拆分。我发现每个片段都调用channelRead和ChannelReadComplete。我通常看到的是ByteBuf在512左右,message在600左右。对于前512个字节,我得到一个channelRead,然后是一个Chann