gpt4 book ai didi

java - 未调用 Netty 编码器

转载 作者:行者123 更新时间:2023-11-29 06:58:47 28 4
gpt4 key购买 nike

使用 Netty 4.0.27 和 Java 1.8.0_20

所以我试图通过构建一个简单的聊天服务器(我猜是典型的网络教程程序?)来了解 Netty 的工作原理。设计我自己的简单协议(protocol),称为 ARC(Andrew 的中继聊天)...所以这就是为什么您在代码中经常看到 ARC。 K,问题来了。

所以我在这里启动服务器并注册各种处理程序...

    public void start()
{
System.out.println("Registering handlers...");
ArcServerInboundHandler inboundHandler = new ArcServerInboundHandler(this);

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try
{
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>()
{
@Override
public void initChannel(SocketChannel ch) throws Exception
{
ch.pipeline().addLast(new ArcDecoder(), inboundHandler);
ch.pipeline().addLast(new ArcEncoder());
}
}).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);

try
{
System.out.println("Starting Arc Server on port " + port);
ChannelFuture f = bootstrap.bind(port).sync();
f.channel().closeFuture().sync();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
finally
{
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}

当用户连接时,我的“inboundHandler”被调用。

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception
{
System.out.println("CLIENT CONNECTED"); // THIS PRINTS, REACHES THIS POINT
ArcPacket packet = new ArcPacket();
packet.setArc("PUBLIC_KEY");
packet.setField("KEY", Crypto.bytesToHex(server.getRsaKeys().getPublic().getEncoded()));
ctx.writeAndFlush(packet);
}

这是我的编码器,它没有似乎根本没有被调用...

public class ArcEncoder extends MessageToByteEncoder<ArcPacket>
{
@Override
protected void encode(ChannelHandlerContext ctx, ArcPacket msg, ByteBuf out) throws Exception
{
System.out.println("ENCODE"); // NEVER GETS HERE
String message = ArcPacketFactory.encode(msg);
byte[] data = message.getBytes("UTF-8");
out.writeBytes(data);
System.out.println("WROTE");
}

@Override
public boolean acceptOutboundMessage(Object msg) throws Exception
{
System.out.println("ACCEPT OUTBOUND MESSAGE"); // NEVER GETS HERE
return msg instanceof ArcPacket;
}
}

所以,

调用ctx.writeAndFlush(packet)的代码;已运行,但它似乎在任何时候都不会调用编码器。我错过了一些明显的东西吗?也许我错误地添加了编码器?尽管当我将它与我见过的其他示例进行比较时,它看起来是正确的。

感谢您的帮助。

最佳答案

您的编码器 (ArcEncoder) 位于入站处理程序之后。这意味着,编码器永远不会评估 ctx.*() 方法调用。要解决您的问题,您必须在入站处理程序之前移动 ArcEncoder:

ch.pipeline().addLast(new ArcDecoder(), new ArcEncoder(), inboundHandler);

关于事件评估顺序的更多信息,请阅读the API documentation of ChannelPipeline .

关于java - 未调用 Netty 编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29616341/

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