2

我一直在用 Apache Mina 开发我的第一个基于 TCP/Socket 的应用程序,它看起来很棒而且做起来很容易。我只想在这里问一个关于米娜的问题。

服务器施加 5 秒的空闲时间将终止套接字连接,因此我们必须发送周期性的心跳(回显消息/keepalive)以确保连接处于活动状态。某种保活机制。

我们有一种方法可以在每 5 秒之前盲目地发送回显/心跳消息。我在想,如果我正在发送我的业务消息并且没有达到空闲时间(即 5 秒),应该有智能/智能方式“空闲监视器”,我不应该发出心跳消息。如果整个连接空闲,将发送心跳消息,这样我们就可以节省带宽并在套接字上快速读写。

4

3 回答 3

4

您可以通过使用Keep Alive 过滤器(已经存在于 mina 中)来实现它。

或者,您可以通过将客户端的会话空闲超时设置为比服务器的空闲超时小一点来实现发送回声/心跳的更智能的方式。例如:

对于服务器端

NioSocketAcceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);

对于客户端来说,这将是

NioSocketConnector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);

现在,如果在 3 秒内没有通信,则会在客户端触发 sessionIdle(并且不会在服务器端触发,因为超时时间为 5 秒),您可以发送回显。这将使会话保持活动状态。只有在会话空闲时才会发送回显。

注意: 我假设在会话空闲时,会话正在服务器端关闭。如果是其他方式,您将需要切换会话空闲超时的值(例如,服务器为 3 秒,客户端为 5 秒),并且将从服务器发送回显。

于 2012-04-05T10:19:10.367 回答
1

我不确定我是否完全理解您的问题,但您可以在 IoHandlerAdapter 的覆盖 sessionIdle 方法中发送心跳。您不必仅仅因为服务器端的 Mina 调用 Idle 就关闭会话。至于在没有这种类型的心跳通信的情况下保持服务器和客户端之间的活动连接的更智能的方式,我从未听说过。

这是关于 microsoft 如何在ActiveSync中处理心跳的有趣读物。在我的客户端/服务器应用程序中使用 mina 时,我个人使用了这种方法。希望这对您有所帮助。

于 2012-04-03T17:19:04.657 回答
1

(我希望我能正确理解这个问题)

我无法让我的会话保持活跃,这个问题出现在 Google 搜索结果中,所以我希望其他人会发现它有用:

    @Test
    public void testClientWithHeartBeat() throws Exception {
        SshClient client = SshClient.setUpDefaultClient();
        client.getProperties().put(ClientFactoryManager.HEARTBEAT_INTERVAL, "500");
        client.start();
        ClientSession session = client.connect("localhost", port).await().getSession();
        session.authPassword("smx", "smx").await().isSuccess();
        ClientChannel channel = session.createChannel(ClientChannel.CHANNEL_SHELL);

        int state = channel.waitFor(ClientChannel.CLOSED, 2000);
        assertTrue((state & ClientChannel.CLOSED) == 0);

        channel.close(false);
        client.stop();
    }

(来源:https ://issues.apache.org/jira/browse/SSHD-185 )

在较新的版本(例如 2.8.0 版)中,启用心跳更改为CoreModuleProperties.HEARTBEAT_INTERVAL.set(client, Duration.ofMillis(500));

于 2015-07-02T04:53:50.187 回答