为了账号安全,请及时绑定邮箱和手机立即绑定

根据输入消息将结果作为 StringEncoder 或 ObjectEncoder 发送到客户端?

根据输入消息将结果作为 StringEncoder 或 ObjectEncoder 发送到客户端?

沧海一幻觉 2021-12-01 19:57:34
我是 Netty 的新手,到目前为止,有一个可以使用 StringEncoder 和 StringDecoder 处理字符串消息的工作客户端服务器,例如:        ServerBootstrap serverBootstrap = new ServerBootstrap();        serverBootstrap.group(bossGroup, workerGroup)                       .channel(NioServerSocketChannel.class)                       .handler(new LoggingHandler(LogLevel.TRACE))                       .childHandler(new ChannelInitializer<SocketChannel>() {                                            @Override                                            public void initChannel(SocketChannel ch) throws Exception {                                                ch.pipeline().addLast(                                                    new LoggingHandler(LogLevel.TRACE),                                                    new DelimiterBasedFrameDecoder(Integer.MAX_VALUE, Delimiters.lineDelimiter()),                                                    new StringEncoder(),                                                    new StringDecoder(),                                                    new ReceiveMessageCommunicatorHandler(localNode, inpeerNodeRegistry, outpeerNodeRegistry));输入消息就像这样:excute_this和服务器发回:ok。现在,我需要做的是服务器收到一条新的文本消息:get_object,它应该将序列化对象作为字节数组发送回任何客户端(例如:telnet 或使用普通套接字的 java 应用程序)。然后在这个客户端中,它可以将这个对象反序列化为 Java 对象。我知道ObjectEncoder()似乎是这样做的方法。但是,它还将应该是字符串的响应序列化为序列化对象,而它应该为某些特定消息(例如:仅get_object)执行此操作。我怎么能告诉 Netty 什么时候应该将结果编码为 StringEncoder,什么时候应该将序列化对象编码为字节数组?
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

可以动态修改管道。当您收到get_object消息时,您可以简单地删除StringEncoder并ObjectEncoder在相关的ChannelInboundHandler


   ChannelPipeline p = ctx.pipeline();

    if (p.get(StringEncoder.class) != null) {

        p.remove(StringEncoder.class);

    }

    p.addLast(new YourObjectEncoder())

或者,如果您知道编码器的名称,则可以进行替换:


p.replace("encoder", "encoder", new YourObjectEncoder());


查看完整回答
反对 回复 2021-12-01
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

当服务器收到消息并将响应写入客户端时,它可以像这段代码一样动态切换编码器。


@Override

protected void channelRead0(ChannelHandlerContext ctx, String message) throws Exception {

    InetSocketAddress address = (InetSocketAddress) ctx.channel().remoteAddress();

    MessageContainer messageContainer = new MessageContainer(message, address);

    log.debug("\n");

    log.debug("Message received: {}", message);


    // Handle received message and write result back to the sender

    Object response = this.handleMessage(messageContainer);

    if (response instanceof String) {

        ctx.channel().pipeline().names();

        ctx.channel().pipeline().remove(ObjectEncoder.class);

        ctx.channel().pipeline().addFirst(new StringEncoder());

    }


    if (response != null) {

        ctx.write(response);

        ctx.flush();

    }

    ctx.close();

}


查看完整回答
反对 回复 2021-12-01
  • 2 回答
  • 0 关注
  • 211 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信