当前位置: 首页 > 知识库问答 >
问题:

Java Netty服务器的高效通道读取

郗唯
2023-03-14

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

共有1个答案

邵沛
2023-03-14

也许是这样的:

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();
                }
            }
        });
    }
}
 类似资料:
  • 所以,我有一个拥有50000用户的应用程序。最近我更新了我的android studio,把SDK编译成了27。我做了一些改变,以支持android 8的变化,包括通知的变化(例如,通知应该有唯一的渠道)。在Android One手机上测试了这个(运行android 8)。一切都很顺利。在更新playstore上的应用程序后,我在android 8设备上看到了这些崩溃(主要是谷歌Pixel手机)

  • 我对Netty是新手。我使用的是Netty 4.0.28。我指的是《Netty in Action》一书中提供的EchoServer示例。 一切正常。客户端在活动通道上向服务器发送消息,服务器打印接收到的消息并将相同的消息发回客户端。稍后客户端通道关闭,但服务器仍将侦听新连接。 我也想关闭服务器通道并将服务器绑定到新端口。 我应该如何关闭服务器通道?

  • 我的web应用程序托管在Websphere application Server中。对于所有传出连接,我们在服务器级别配置了动态SSL越界。目前,由于修补程序,SSLv3已被禁用。现在,即使我们升级了SSL出站以支持TLSV1.2,并使用了基于TLS的通道MQ通道,到WMQ的连接仍然失败。详情如下。有人能帮忙吗? Websphere Server详细信息:

  • 问题内容: 我不知道如何通过JSch Shell通道发送命令。 我这样做,但是不起作用: 然后我读这样的输入: 问题答案: 如果挂起,则意味着您的“ while”永远不会结束(考虑您的代码可能不太可能),或者正在等待其“源”,即线程原因造成的阻塞。 如果没有看到调试信息,我就无法对您的代码进行故障排除。但是作为建议,您尝试过吗?这个想法是将控制台输入传递到“您的”输出,以便您可以“编写”它。为此,

  • 我正在尝试实现一组服务,这些服务暂时使用tcp实现,但最终将移动到udp。我将proto文件转换为rpc接口,但这需要服务器、rpc通道和rpc控制器。 我不知道什么是rpc控制器和rpc通道,更不用说如何实现它们了。有人能解释一下吗? 提前谢谢。

  • 问题内容: 如何通过服务读取JSON文件? 我正在为测试目的而开发一个非常基本的Angular应用程序,并且现在只是尝试从JSON文件中读取数据。我将此代码放在服务中,以便在移动基于服务器的数据存储时可以更轻松地将其换出。 我和声明如下: 目前,我的定义如下: 我得到的控制台输出如下: 当我尝试调用my时收到错误消息(如果我理解正确的话),这应该将我的JSON文件放入其中。 我一直使用Angula