使用服务器入站通道channelActive
方法初始化客户端通道。而且我可以看到pcap已完成3次握手(本地主机为253,远程主机为15)
但是在写入客户频道时,它会抛出
java.nio.channels.NotYetConnectedException:在null io.netty.channel.AbstractChannel $ AbstractUnsafe.flush0()(未知 来源)
据我了解,客户端通道应处于活动状态,因为三向握手意味着客户端通道已准备好发送数据包。但是通过评估clientChannel.isActive(),结果是错误的,奇怪的。
服务器入站通道:
Channel clientChannel;
@Override
public void channelActive(ChannelHandlerContext ctx) {
final Channel inboundChannel = ctx.channel();
try {
Bootstrap b = new Bootstrap();
b.group(inboundChannel.eventLoop())
.channel(inboundChannel.getClass())
.handler(new SomeClientChannelInitializer(ctx));
// Make the connection attempt.
ChannelFuture f = b.connect(host, port);
clientChannel = f.channel();
} catch (Exception e) {// no exception}
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
log.info("receive: {}", msg);
clientChannel.writeAndFlush(msg -> this::pojo);
}
编辑:
我通过添加wait
f = b.connect(host, port);
clientChannel = f.channel();
try {
f.await(3L, TimeUnit.SECONDS);
boolean success = clientChannelFuture.isSuccess();
我不确定这是否合适,官方代理示例没有此内容。
答案 0 :(得分:2)
您要么需要通过连接到连接ChanneFutureListener
的{{1}}进行写操作,要么需要在连接上ChannelFuture
/ sync()
上书写。
记住netty中的所有内容都是异步的,这意味着当wait()
方法返回并触发connect
时,write
可能尚未完全连接。