我一直在用Apache Mina开发我的第一个基于TCP/Socket的应用程序,它看起来很棒,做事情也很容易。我只想问一个关于米娜的问题。
服务器设置5秒的空闲时间将终止套接字连接,因此我们必须发送周期性的心跳(回显消息/保持连接)以确保连接处于活动状态。一种保活机制。
有一种方法是我们在每5秒之前发送一次盲目的回应/心跳消息。我在想,应该有智能/智能的方式“空闲监视器”如果我正在发送我的业务消息,而不是到达空闲时间,即5秒,我不应该发出心跳消息。在整个连接空闲的情况下发送心跳报文,节省了带宽,提高了socket的读写速度。
发布于 2012-04-05 18:19:10
你可以通过使用Keep Alive Filter (已经存在于mina中)来实现它。
或者,您可以通过设置客户端的会话空闲超时略小于服务器的空闲超时来实现更智能的回声/心跳发送方式。例如:
对于服务器端
NioSocketAcceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);而对于客户端来说,它将是
NioSocketConnector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);现在,假设有3秒没有通信,客户端将触发一个sessionIdle (并且不会在服务器端触发,因为超时有5秒),您可以发送一个回应。这将使会话保持活动状态。只有当会话空闲时,才会发送回送。
注意:我假设在会话空闲时,会话在服务器端被关闭。如果是另一种情况,您将需要切换会话空闲超时值(例如,对于服务器为3秒,对于客户端为5秒),并且将从服务器发送回应。
发布于 2012-04-04 01:19:05
我不确定我是否完全理解您的问题,但是您可以在IoHandlerAdapter的被覆盖的sessionIdle方法中发送心跳。您不需要仅仅因为服务器端的Mina调用Idle就关闭会话。至于一种更智能的方式来维护服务器和客户端之间的活动连接,而不需要这种类型的心跳通信,我从来没有听说过这种方式。
这里有一个关于微软如何在ActiveSync中处理心跳的有趣读物。在我的客户机/服务器应用程序中使用mina时,我亲自使用了这种方法。希望这对你有所帮助。
发布于 2015-07-02 12:53:50
(我希望我正确理解了这个问题)
我很难保持会话的活力,这个问题出现在谷歌搜索结果中,所以我希望其他人能发现它是有用的:
@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://stackoverflow.com/questions/9997748
复制相似问题