Нетти, почему канал еще не подключен - PullRequest
0 голосов
/ 27 июня 2018

канал клиента инициализируется в методе входящего канала сервера channelActive. И я мог видеть, что pcap завершил трехстороннее рукопожатие (253 - локальный хост, 15 - удаленный)

packets in pcap

Но при записи на клиентский канал он выдает

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();

Я не уверен, подходит ли это, официальный пример прокси не имеет этого.

1 Ответ

0 голосов
/ 27 июня 2018

Вам либо нужно написать через ChanneFutureListener, который вы подключаете к соединению ChannelFuture, либо вам нужно sync() / wait() на нем.

Помните, что все в netty асинхронно, что означает, что когда возвращается метод connect и вы запускаете write, Channel может быть еще не полностью подключен.

...