用于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。