Java Netty Server的高效channelRead

时间:2015-11-02 11:16:13

标签: java netty

我正在使用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();
                }
            }
        });
    }
}

2 个答案:

答案 0 :(得分:0)

也许是这样的:

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();
                }
            }
        });
    }
}

答案 1 :(得分:0)

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