netty为什么频道尚未连接
在服务器入站通道netty为什么频道尚未连接,netty,Netty,在服务器入站通道channelActive方法中初始化客户端通道。我可以看到pcap已经完成了三次握手(253是本地主机,15是远程主机) 但是当写入客户机通道时,它抛出 java.nio.channels.NotYetConnectedException:在 io.netty.channel.AbstractChannel$AbstractSafe.flush0()(未知 (来源) 根据我的理解,客户端通道应该处于活动状态,因为三方握手意味着客户端通道已经准备好发送数据包。但通过计算clie
channelActive
方法中初始化客户端通道。我可以看到pcap已经完成了三次握手(253是本地主机,15是远程主机)
但是当写入客户机通道时,它抛出
java.nio.channels.NotYetConnectedException:在
io.netty.channel.AbstractChannel$AbstractSafe.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();
我不确定这是否合适,官方代理示例中没有这一点 您需要通过连接到connect
ChannelFuture
的ChanneFutureListener
进行写入,或者需要对其进行sync()
/等待()
请记住,netty中的所有内容都是异步的,这意味着当connect
方法返回并触发write
时,通道可能尚未完全连接