В чем разница между channelActive и channelRead в netty? - PullRequest
2 голосов
/ 06 мая 2019

Кто-нибудь знает В чем разница между channelActive и channelRead в netty?

Я изучаю Netty, прочитав Руководство пользователя Netty (https://netty.io/wiki/user-guide-for-4.x.html)

Я попытался написать эхо-сервер, и вот мой входящий ChannelHandler.

Я запустил свой эхо-сервер, и когда я пытаюсь подключиться к своему серверу по telnet, используя его IP-адрес и порт, ничего не выводится, кроме сообщения: «Потеряно соединение с хостом»

Когда я отлаживаю свой код, я обнаруживаю, что выполнение входит в метод channelActive, но не в channelRead.

Я хочу знать, в чем разница между channelActive и channelRead в netty и почему исполнение попадает в channelActive.

Вот мой ChannelHandler

package com.yjz.middleware.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;
import io.netty.util.ReferenceCounted;

import java.nio.Buffer;

public class DiscardServerHandler extends ChannelInboundHandlerAdapter {
  @Override
  public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    ByteBuf in = (ByteBuf) msg;
    System.out.print(in.toString(CharsetUtil.UTF_8));
    ctx.write(msg);
    ctx.flush();
  }

  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    // Close the connection when an exception is raised.
    cause.printStackTrace();
    ctx.close();
  }

  @Override
  public void channelActive(ChannelHandlerContext ctx) throws Exception {
    final ByteBuf time = ctx.alloc().buffer(4);
    time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));
    final ChannelFuture f = ctx.writeAndFlush(time);
    f.addListener(new ChannelFutureListener() {
      @Override
      public void operationComplete(ChannelFuture future) throws Exception {
        assert f == future;
        ctx.close();
      }
    });
  }
}

1 Ответ

2 голосов
/ 06 мая 2019

Разница в том, что channelActive(...) вызывается после того, как канал стал активным (что для TCP означает, что канал подключен), а channelRead(...) вызывается после получения сообщения.

Когда вы используете закрытие канала непосредственно в ChannelFutureListener, который используется в channelActive(...), ваш channelRead(...) никогда не вызывается.

...