有人知道Netty中channelActive和channelRead之间的区别吗?
我通过阅读netty用户指南(https://netty.io/wiki/user-guide-for-4.x.html)来学习netty
我尝试编写一个回显服务器,下面是我的入站ChannelHandler
。
我已经启动了我的echo服务器,当我尝试使用服务器的IP地址和端口telnet时,除了消息:“丢失到主机的连接”之外,没有任何输出。
调试代码时,我发现执行进入ChannelActive
方法,而不是ChannelRead
。
我想知道netty中的ChannelActive
和ChannelRead
之间有什么区别,以及为什么执行会进入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();
}
});
}
}
不同之处在于,通道激活后(对于TCP而言,这意味着通道已连接)调用ChannelActive(...)
,而收到消息后调用ChannelRead(...)
。
当您在ChannelActive(...)
中使用的ChannelFutureListener
中直接关闭通道时,您的ChannelRead(...)
将永远不会被调用。
问题内容: 我注意到ctx在处理程序之间是不同的,即使这些处理程序位于同一管道中,例如 在MyHander1中 在MyHandler2中 和输出: 我注意到ctx不同,但频道相同 所以在调用ctx.write()和ctx.channel()。write()之间有什么区别吗? 问题答案: 是的,有… Channel.write(..)始终从ChannelPipeline的尾部开始,因此通过所有Cha
问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa
问题内容: JavaScript中的&和&&有什么区别? 示例代码: 似乎&&是一个逻辑上的“和”,如果两个都为true,则总是为我提供第二个值。 但是什么是&? (顺便说一下,&&在Python中似乎是“ and”;&在Python中似乎是&。) 问题答案: 是按位AND 该运算符期望 两个数字 并重新调整一个 数字。 如果它们不是数字,则将其强制转换为数字。 注意: 在Javascript中,
问题内容: 我正在从Spring 2.5迁移到Spring 3。 他们介绍了一些黑魔法。预期仅在servlet配置文件中声明。 在Spring 2.5中,我刚刚使用,并且在分发服务器servlet配置XML中声明了标记,并使用了要扫描的基本包。 所以,我不知道是什么样的区别,并在servlet配置标签和我有什么可以消除在Spring3配置文件? 问题答案: 声明一般注释,比如支持,等等。 声明了注
问题内容: 我是Go编程语言的新手。 我注意到Go中有一些奇怪的地方:我认为它在Python中使用并替代了,但是当我在Go中使用时,它也是可行的。 和之间有什么区别? 问题答案: 是分配。有关Go中分配的更多信息:分配 和在变量声明中使用时的细微差别。 Go中变量声明的一般形式是: 上面的声明创建一个特定类型的变量,为其添加名称,并设置其初始值。 无论是或可以省略,但不能同时使用。 例如: 被称为
问题内容: 。*是零个或多个次数的任何字符。我试图找到以元音开头的单词,我用过 它给了我所有以元音开头的单词。当我这样做时,也会得到相同的结果。 现在,我正在寻找以元音结尾的单词。我做了 它没有给出任何结果,但是当我这样做时却给出了有效的结果。请解释两者含义上的差异。谢谢 问题答案: 看起来,在Oracle11中,和模式(之前没有任何内容)会生成零宽度的匹配项。所以与被捕获组包含零宽度的图案或分别