用于Java Netty服务器的高效channelRead

用于Java Netty服务器的高效channelRead

问题描述:

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

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

也许是这样的:

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

我建议不要使用StringBuilder的所有

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