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

读取字符串并用Netty中的字节回复

陆斌
2023-03-14

我是Netty的新手,已经成功创建了一个通过TLS工作的服务器。我现在正在设计第二台服务器,但我对管道有一些问题。我需要的是一个动态管道,比如Netty的port unification示例:http://netty.io/4.0/xref/io/netty/example/portunification/PortUnificationServerHandler.html

每个连接都从客户端发送UTF-8编码的字符串开始。我看得很清楚,但我的回答不清楚。我的回答只是一个3字节的字节数组。

这是我的服务器:

// Configure the server
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
            .channel(NioServerSocketChannel.class)
            .option(ChannelOption.SO_BACKLOG, 100)
            .handler(new LoggingHandler(LogLevel.INFO))
            .childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    ChannelPipeline pipeline = ch.pipeline();
                    pipeline.addLast(new LineBasedFrameDecoder(192));
                    pipeline.addLast(new StringDecoder(CharsetUtil.UTF_8));
                    pipeline.addLast(new ByteArrayEncoder());
                    pipeline.addLast(new TokenHandler());
                }
            });

    // Start the server
    ChannelFuture f = b.bind(port).sync();

    // Wait until the server socket is closed
    f.channel().closeFuture().sync();
}
finally {
    // Shut down all event loops to terminate all threads
    bossGroup.shutdownGracefully();
    workerGroup.shutdownGracefully();
}

我的TokenHandler是SimpleChannelInboundHandler:

public class TokenHandler extends SimpleChannelInboundHandler<String> {
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String token) throws Exception {
        System.out.println("Token received: " + token);
        channelHandlerContext.writeAndFlush(new byte[] {2, 1, 0});
    }
}

我还试着用

channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer(new byte[] {2, 1, 0}));

从我的管道中删除ByteArrayEncoder,但这没有任何区别:没有发送字节。如果我添加一个StringEncoder,我可以发送字符串,Netty的Echo示例也可以工作(可从用户指南:http://netty.io/wiki/user-guide-for-4.x.html).我猜这对Netty来说是个基本的错误,但我找不到其他有类似问题的人。

编辑:我用的是Netty 4.0.34。最终的

共有1个答案

邬弘化
2023-03-14

我应该更仔细地阅读这些文件。解决方案是将super(true)添加到TokenHandler的构造函数中,因为默认情况下,SimpleChannelInboundHandler会在处理后释放其消息,从而阻止响应在管道中进一步传播。

 类似资料:
  • 问题内容: 我正在将jQuery AJAX POST发布到Servlet,并且数据采用JSON字符串的形式。它已成功发布,但在Servlet端,我需要将这些键- 值对读入Session Object并将其存储。我尝试使用JSONObject类,但无法获取它。 这是代码段 在Servlet方面 问题答案: 您实际上并没有解析json。

  • 我刚来Java,如果这是个明显的问题,我很抱歉。 我正在尝试逐个字符读取字符串以创建树节点。例如,输入,节点为 我注意到了 我可以用一个循环来获得所有的角色吗?就像 我试过了,但不管用。 我该怎么做? 非常感谢你的帮助。 扫描器读取器=新扫描器(System.in);System.out.println(“将节点输入为大写字母,不带空格,结尾为'/'”);int i=0;char node=rea

  • 如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?

  • 问题内容: 为了转换字符串,我将其转换为字节,如下所示: 为了转换,我做了:显然不起作用。我将如何转换回去? 问题答案: 您原来的城市名称中有哪些字符?尝试这样的UTF-8版本:

  • 我正在寻找一种在读取字节(作为字节[])和从文件中读取字符串行之间切换的方法。我知道字节[]可以通过FileInputStream从文件中获取,字符串可以通过BufferedReader获取,但同时使用这两个字节是有问题的。我知道字节段有多长。当我写文件时,字符串编码可以保持不变。该文件类型是一个仍在开发中的自定义文件类型,因此我可以更改向其写入数据的方式。 我怎么能读取字符串和字节[]s从相同的

  • 如何读取文件并从json转换为字符串?示例:我的文件编号为。json[“23423423”,“234234234”,“53453453”] 我想要的是:String numbers=“'23423423','234234234','53453453'”;