写入通道的消息未进入管道
Message written to a channel not going into the pipeline
服务器和客户端都会发生这种情况。我有来自 channelActive 方法的 ChannelHandlerContext,我正在尝试使用 writeAndFlush(Object msg) 方法向它写入一个对象,但似乎 msg 从未进入创建的管道。
这是我的客户端处理程序的样子(我覆盖了数据包解码器和编码器中的一些方法进行调试)
public ChannelHandlerContext channel;
...
...
(method to start client is called)
EventLoopGroup workerGroup = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
b.group(workerGroup);
b.channel(NioSocketChannel.class);
b.option(ChannelOption.SO_KEEPALIVE, true);
b.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(
new PacketDecoder(clientRegistries){
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
List<Packet> packets = PacketHelper.handle(in, ctx, super.serverRegistries);
packets.forEach(packet -> {
System.out.println(packet.getClass());
});
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
channel = ctx;
ctx.fireChannelActive();
}
},
new PacketEncoder(){
@Override
protected void encode(ChannelHandlerContext ctx, Pair<PacketRegistry, Packet> msg, ByteBuf out) throws Exception {
System.out.println("message encoded on client sent to server");
super.encode(ctx, msg, out);
}
}
);
}
});
ChannelFuture f = b.connect(host, port).sync();
这是我写入 ChannelHandlerContext 通道变量的方式
public void sendPacket(PacketRegistry registry, Packet p) {
System.out.println("data written to server from client");
channel.writeAndFlush(new Pair<>(registry, p));
}
当我 运行 我的代码时,“从客户端写入服务器的数据”是打印机,但从不打印“发送到服务器的客户端编码的消息”。
我想知道我做错了什么,任何帮助将不胜感激。如上所述,当我尝试使用 channelActive 方法中的 ChannelHandlerContext 进行编写时,服务器上也会发生同样的事情。
好的,我找到了答案,而且非常简单。
我没有使用 channelActive 方法(用于 udp),而是需要使用 channelRegistered 方法(用于 tcp)。
服务器和客户端都会发生这种情况。我有来自 channelActive 方法的 ChannelHandlerContext,我正在尝试使用 writeAndFlush(Object msg) 方法向它写入一个对象,但似乎 msg 从未进入创建的管道。
这是我的客户端处理程序的样子(我覆盖了数据包解码器和编码器中的一些方法进行调试)
public ChannelHandlerContext channel;
...
...
(method to start client is called)
EventLoopGroup workerGroup = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
b.group(workerGroup);
b.channel(NioSocketChannel.class);
b.option(ChannelOption.SO_KEEPALIVE, true);
b.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(
new PacketDecoder(clientRegistries){
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
List<Packet> packets = PacketHelper.handle(in, ctx, super.serverRegistries);
packets.forEach(packet -> {
System.out.println(packet.getClass());
});
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
channel = ctx;
ctx.fireChannelActive();
}
},
new PacketEncoder(){
@Override
protected void encode(ChannelHandlerContext ctx, Pair<PacketRegistry, Packet> msg, ByteBuf out) throws Exception {
System.out.println("message encoded on client sent to server");
super.encode(ctx, msg, out);
}
}
);
}
});
ChannelFuture f = b.connect(host, port).sync();
这是我写入 ChannelHandlerContext 通道变量的方式
public void sendPacket(PacketRegistry registry, Packet p) {
System.out.println("data written to server from client");
channel.writeAndFlush(new Pair<>(registry, p));
}
当我 运行 我的代码时,“从客户端写入服务器的数据”是打印机,但从不打印“发送到服务器的客户端编码的消息”。
我想知道我做错了什么,任何帮助将不胜感激。如上所述,当我尝试使用 channelActive 方法中的 ChannelHandlerContext 进行编写时,服务器上也会发生同样的事情。
好的,我找到了答案,而且非常简单。 我没有使用 channelActive 方法(用于 udp),而是需要使用 channelRegistered 方法(用于 tcp)。