use*_*786 1 sockets tcp wireshark netty
我正在使用 netty 4.x,我终于发现它调用了
public boolean isActive() {
SocketChannel ch = javaChannel();
return ch.isOpen() && ch.isConnected();
}
Run Code Online (Sandbox Code Playgroud)
我可以用它来检查客户端和服务器之间的连接是否可读/可写吗?
如果答案是肯定的,那么我相信 isActive use sth。像心跳一样检查客户端的状态。但是当我抓取 tcp 数据包时,我找不到任何数据包通过wireshark过滤器 tcp.port==12093(这是我的服务器端口)作为心跳。
任何建议都有帮助。
Channel.isActive() 通过查找查询底层套接字来查看它是否已连接来工作。
所以如果我们想知道它是如何工作的,我们应该更深入地挖掘,如果你使用 netty 和 tcp 连接,你几乎可以肯定你使用的是 java nio sockets。
来自 io.netty.channel.socket.nio.NioSocketChannel:
Run Code Online (Sandbox Code Playgroud)@Override public boolean isActive() { SocketChannel ch = javaChannel(); return ch.isOpen() && ch.isConnected(); }
上述两种方法都不是那么有趣,只是由本机代码设置为正确值的布尔标志。
但是,由于 isActive() 仅返回这些布尔标志,因此您无法确定在调用该函数时连接仍在工作,最好的方法是更改您的协议以包含某种 ping 消息,例如 IRC有 ping 命令,或 FTP 有 NOOB 命令。
发送ping报文时,一定要保证留有足够的余量来应对部分网络掉线,比如你的电脑是通过WIFI连接的,就会有一些丢包的情况。但是,操作系统中的原生 tcp 层应该为您处理这些丢包和重新发送的问题,但这可能意味着在您发送 ping 消息后,可能需要整整一分钟,然后 isActive() 才会返回 false。
如果您想向您的协议添加自动 ping 消息,查看IdleStateHandler和WriteTimeoutHandler可能是明智的。