【问题标题】:Efficient channelRead for Java Netty ServerJava Netty Server 的高效 channelRead
【发布时间】:2016-02-02 06:14:46
【问题描述】:

我正在使用netty开发一个代理服务器,我的代理ProxyBackendHandler类如下。在 channelRead 方法中,我需要获取 msg 数据并作为 TextWebSocketFrame 写入客户端。为此,我使用了 StringBuilder 和 while 循环来迭代 ByteBuf。任何人都可以建议我一个更好的方法来做到这一点,因为似乎上面的代码在高数据加载时具有很高的性能开销。

public class ProxyBackendHandler extends ChannelInboundHandlerAdapter {

    private final Channel inboundChannel;
    StringBuilder sReplyBuffer;

    public ProxyBackendHandler(Channel inboundChannel) {
        this.inboundChannel = inboundChannel;
        sReplyBuffer = new StringBuilder(4000);
    }

    @Override
    public void channelRead(final ChannelHandlerContext ctx, Object msg) {

        // Please suggest a efficient implementation for read msg and pass it to writeAndFlush.
        ByteBuf in = (ByteBuf) msg;
        sReplyBuffer.setLength(0); 

        try {
            while (in.isReadable()) { 
                sReplyBuffer.append((char) in.readByte());
            }
        } finally {
            ((ByteBuf) msg).release(); 
        }

        inboundChannel.writeAndFlush(new TextWebSocketFrame (sReplyBuffer.toString())).addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) {
                if (future.isSuccess()) {
                    ctx.channel().read();
                    System.out.println("Sent To Client");
                } else {
                    future.channel().close();
                }
            }
        });
    }
}

【问题讨论】:

    标签: java netty


    【解决方案1】:

    可能是这样的:

    public class ProxyBackendHandler extends ChannelInboundHandlerAdapter {
    
        private final Channel inboundChannel;
    
        public ProxyBackendHandler(Channel inboundChannel) {
            this.inboundChannel = inboundChannel;
        }
    
        @Override
        public void channelRead(final ChannelHandlerContext ctx, Object msg) {
            inboundChannel.writeAndFlush(new TextWebSocketFrame((ByteBuf) msg)).addListener(new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) {
                    if (future.isSuccess()) {
                        ctx.channel().read();
                        System.out.println("Sent To Client");
                    } else {
                        future.channel().close();
                    }
                }
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

      我建议根本不要使用 StringBuilder。只需使用您已有的缓冲区。您没有说明 TextWebSocketFrame 可能是什么,或者您认为需要它的原因,但最终代理服务器只需要复制字节。您不需要 StringBuilders 或额外的类。坦率地说,还是 Netty。

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 2014-02-15
        • 2015-11-19
        • 2019-09-23
        • 2015-09-28
        • 2018-12-05
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多