канал клиента инициализируется в методе входящего канала сервера channelActive
. И я мог видеть, что pcap завершил трехстороннее рукопожатие (253 - локальный хост, 15 - удаленный)
Но при записи на клиентский канал он выдает
java.nio.channels.NotYetConnectedException: null at
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);
}
EDIT:
Я решил это, добавив wait
f = b.connect(host, port);
clientChannel = f.channel();
try {
f.await(3L, TimeUnit.SECONDS);
boolean success = clientChannelFuture.isSuccess();
Я не уверен, подходит ли это, официальный пример прокси не имеет этого.