Кто-нибудь знает
В чем разница между 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();
}
});
}
}