Channel.isActive() 如何在 netty 中工作?

how Channel.isActive() works in netty?

我在用netty4.x,终于找到它调用

public boolean isActive() {
    SocketChannel ch = javaChannel();
    return ch.isOpen() && ch.isConnected();
}

我可以用它来检查客户端和服务器之间的连接是否readable/writeable吗?

如果答案是肯定的,那么我相信isActive use sth。像心跳一样检查客户端的状态。但是当我抓取 tcp 数据包时,我找不到任何数据包通过 wireshark 过滤器作为心跳工作 tcp.port==12093(这是我的服务器端口)。

任何建议都是有帮助的。

Channel.isActive() 通过查找查询底层套接字以查看它是否已连接来工作。

所以如果我们想知道它是如何工作的,我们应该更深入地挖掘,如果你使用带有 tcp 连接的 netty,你几乎可以肯定你正在使用 java nio sockets

来自io.netty.channel.socket.nio.NioSocketChannel:

@Override
public boolean isActive() {
    SocketChannel ch = javaChannel();
    return ch.isOpen() && ch.isConnected();
}

上述两种方法都不是很有趣,它们只是由本机代码设置为正确值的布尔标志。

但是,由于 isActive() 只是 return 那些布尔标志,您无法确定在调用该函数时连接是否仍在工作,最好的方法是将协议更改为包括某种 ping 消息,例如 IRC 有一个 ping 命令,或者 FTP 有 NOOB 命令。

发送ping报文时,一定要留出足够的空间让部分网络丢包,比如你的电脑是通过WIFI连接的,就会有一些丢包。但是,操作系统中的本机 tcp 层应该为您处理这些丢包并重新发送,但这可能意味着在您发送 ping 消息后,可能需要整整一分钟 isActive() 才会 return 错误。

如果您想在协议中添加自动 ping 消息,查看 IdleStateHandler and the WriteTimeoutHandler.

可能是明智的选择