我一直在使用Apache Mina开发我的第一个基于TCP / Socket的应用程序,它看起来很棒且易于操作。我只想在这里问一个关于米娜的问题。
服务器强制空闲时间为5秒将终止套接字连接,因此我们必须发送定期心跳(echo message / keepalive)以确保连接处于活动状态。一种keepalive机制。
我们有一种方法可以在每5秒钟之前发送一次回声/心跳消息。我在想,如果我发送我的商业信息并且没有来到空闲时间,即5秒钟,应该有智能/智能方式“空闲监视器”,我不应该发出心跳消息。如果整个连接空闲,将发送心跳消息,以便我们节省带宽和快速读取&写在插座上。
提前感谢所有喜欢这个概念并尝试提供解决方案的人。
答案 0 :(得分:4)
你可以使用Keep Alive Filter(已经存在于mina中)来实现它。
或者,您可以通过将客户端的会话空闲超时设置为小于服务器的空闲超时来实现更智能的发送回声/心跳的方式。例如:
对于服务器端
NioSocketAcceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);
对于客户端,它将是
NioSocketConnector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);
现在,如果没有让我们说3秒钟的通信,则会在客户端触发sessionIdle(并且它将不会在服务器端触发,因为超时有5秒)并且您可以发送回声。这将使会话保持活力。仅当会话空闲时才会发送回声。
注意: 我假设在会话空闲时,会话正在服务器端关闭。如果是相反的方式,则需要切换会话空闲超时值(例如服务器为3秒,客户端为5秒),并且将从服务器发送回声。
答案 1 :(得分:1)
我不确定我是否完全理解您的问题,但您可以在IoHandlerAdapter的重写sessionIdle方法中发送心跳。您不需要因为服务器端的Mina调用Idle而必须关闭会话。至于在没有这种类型的心跳通信的情况下维持服务器和客户端之间的活动连接的更智能的方式,我从未听说过。
以下是有关Microsoft如何处理ActiveSync心跳的有趣读物。在我的客户端/服务器应用程序中使用mina时,我个人使用了这种方法。希望这对你有所帮助。
答案 2 :(得分:0)
(我希望我能正确理解这个问题)
我无法让我的会话保持活跃状态,这个问题出现在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();
}