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.
可能是明智的选择
我在用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.
可能是明智的选择