【问题标题】:how Channel.isActive() works in netty?Channel.isActive() 如何在 netty 中工作?
【发布时间】:2016-04-10 19:49:14
【问题描述】:

我用的是netty 4.x,终于发现它调用了

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

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

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

任何建议都有帮助。

【问题讨论】:

  • isActive 告诉您套接字是否打开并连接。正如您在代码中看到的那样......
  • 你最好问问SocketChannelisActive是怎么工作的

标签: sockets tcp netty wireshark


【解决方案1】:

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() 只返回那些布尔标志,因此您无法确定在调用该函数时连接是否仍在工作,最好的方法是更改​​您的协议以包含某种 ping 消息,例如 IRC 有 ping 命令,或者 FTP 有 NOOB 命令。

在发送 ping 消息时,您必须确保它为部分网络丢失留有足够的空间,例如如果您的计算机通过 WIFI 连接,则会出现一些丢包。但是,操作系统中的原生 tcp 层应该为您处理这些丢包和重发,但这可能意味着在您发送 ping 消息后,可能需要整整一分钟,isActive() 才会返回 false。

如果您想在您的协议中添加自动 ping 消息,最好查看IdleStateHandlerWriteTimeoutHandler

【讨论】:

  • 正是我想要的!我现在对本机代码如何设置打开和连接标志有点兴趣。我怎样才能检查出来?
  • @user3754786 您可以使用 java 调试器在布尔标志上设置断点,如果触发了这些断点,您可以进一步跟踪堆栈跟踪(我使用调试器来获取那些布尔标志)
猜你喜欢
  • 2017-01-09
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2012-03-11
  • 1970-01-01
  • 2012-12-11
  • 2013-08-09
相关资源
最近更新 更多