gpt4 book ai didi

java - 在 Netty 中读取字符串并用字节回复

转载 作者:行者123 更新时间:2023-11-30 07:31:38 25 4
gpt4 key购买 nike

我是 Netty 新手,并且已经成功创建了一个通过 TLS 运行的服务器。我现在正在设计第二台服务器,但我在管道方面遇到了一些问题。我需要的是一个动态管道,如 Netty 的端口统一示例: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.Final

最佳答案

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

关于java - 在 Netty 中读取字符串并用字节回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36030120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com