心跳协议,对基于CS模式的系统开发来说是一种比较常见与有效的连接检测方式,最近在用MINA框架,原本自己写了一个心跳协议实现,后来突然发现MINA本身带有这样一个心跳实现,感于对框架的小小崇拜,在实践的同时研究了一下!
MINA本身提供了一个过滤器类: org.apache.mina.filter.keepalive . KeepAliveFilter ,该过滤器用于在IO空闲的时候发送并且反馈心跳包(keep-alive request/response)。
说到KeepAliveFilter这个类有必要先说一说其构造函数,即实例化该类需要些什么,该类构造函数中参数有三个分别是:
(1)KeepAvlieMessageFactory: 该实例引用用于判断接受与发送的包是否是心跳包,以及心跳请求包的实现
(2)IdleStatus: 该过滤器所关注的空闲状态,默认认为读取空闲。 即当读取通道空闲的时候发送心跳包
(3)KeepAliveRequestTimeoutHandler: 心跳包请求后超时无反馈情况下的处理机制 默认为CLOSE 即关闭连接
首先需要实现接口 KeepAliveMessageFactory 。 该接口中的抽象方法有:
一般来说心跳机制主要分为以下四类:
1, active 活跃型: 当读取通道空闲的时候发送心跳请求,一旦该心跳请求被发送,那么需要在keepAliveRequestTimeout时间内接收到心跳反馈,否则KeepAliveRequestTimeoutHandler将会被调用,当一个心跳请求包被接受到后,那么心跳反馈也会立即发出。
针对活跃型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)与getResponse ( IoSession session, Object request)必须返回非空。
2, semi-active 半活跃型:当读取通道空闲的时候发送心跳请求,然而并不在乎心跳反馈有没有,当一个心跳请求包被接收到后,那么心跳反馈也会立即发出。
针对半活跃型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)与getResponse ( IoSession session, Object request)必须返回非空。并且心跳包请求后超时无反馈的处理机制设置为KeepAliveRequestTimeoutHandler.NOOP(不做任何处理), KeepAliveRequestTimeoutHandler.LOG(只输出警告信息不做其他处理)
3, passive 被动型:当前IO不希望主动发送心跳请求,但是当接受到一个心跳请求后,那么该心跳反馈也会立即发出。
针对被动型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)必须反馈null 与 getResponse ( IoSession session, Object request)必须反馈non-null.
4, deaf speaker 聋子型: 当前IO会主动发送心跳请求,但是不想发送任何心跳反馈。
针对聋子型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)必须反馈non-null与 getResponse ( IoSession session, Object request)必须反馈null,将KeepAliveRequestTimeoutHandler 设置为DEAF_SPEAKER.
5, sient-listener 持续监听型:既不想发送心跳请求也不想发送心跳反馈。
针对持续监听型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)必须反馈null 与 getResponse ( IoSession session, Object request)必须反馈null.
心跳包请求超时后的处理机制:接口 KeepAliveRequestTimeoutHandler ,一般该处理主要是针对能够发送心跳请求的心跳机制。
1.CLOSE:关闭连接
2,LOG:输出 警告信息
3,NOOP:不做任何处理
4,EXCEPTION:抛出异常
5,DEAF_SPEAKER:一个特殊的处理,停止当前过滤器对对心跳反馈监听,因此让过滤器丢失请求超时的侦测功能。(让其变成聋子)
6,keepAliveRequestTimeout(KeepAliveFilter filter, IoSession session); 自定义处理
下面对客户端与服务端和分别举个例子:
服务器:
以被动型心跳机制为例,服务器在接受到客户端连接以后被动接受心跳请求,当在规定时间内没有收到客户端心跳请求时 将客户端连接关闭
主要代码如下:
说到KeepAliveFilter这个类有必要先说一说其构造函数,即实例化该类需要些什么,该类构造函数中参数有三个分别是:
(1)KeepAvlieMessageFactory: 该实例引用用于判断接受与发送的包是否是心跳包,以及心跳请求包的实现
(2)IdleStatus: 该过滤器所关注的空闲状态,默认认为读取空闲。 即当读取通道空闲的时候发送心跳包
(3)KeepAliveRequestTimeoutHandler: 心跳包请求后超时无反馈情况下的处理机制 默认为CLOSE 即关闭连接
首先需要实现接口 KeepAliveMessageFactory 。 该接口中的抽象方法有:
Object |
getRequest(IoSession session)
Returns a (new) keep-alive request message.
|
Object |
getResponse(IoSession session, Object request)
Returns a (new) response message for the specified keep-alive request.
|
boolean |
isRequest(IoSession session, Object message)
Returns true if and only if the specified message is a keep-alive request message.
|
boolean |
isResponse(IoSession session, Object message)
Returns true if and only if the specified message is a keep-alive response message;
|
一般来说心跳机制主要分为以下四类:
1, active 活跃型: 当读取通道空闲的时候发送心跳请求,一旦该心跳请求被发送,那么需要在keepAliveRequestTimeout时间内接收到心跳反馈,否则KeepAliveRequestTimeoutHandler将会被调用,当一个心跳请求包被接受到后,那么心跳反馈也会立即发出。
针对活跃型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)与getResponse ( IoSession session, Object request)必须返回非空。
2, semi-active 半活跃型:当读取通道空闲的时候发送心跳请求,然而并不在乎心跳反馈有没有,当一个心跳请求包被接收到后,那么心跳反馈也会立即发出。
针对半活跃型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)与getResponse ( IoSession session, Object request)必须返回非空。并且心跳包请求后超时无反馈的处理机制设置为KeepAliveRequestTimeoutHandler.NOOP(不做任何处理), KeepAliveRequestTimeoutHandler.LOG(只输出警告信息不做其他处理)
3, passive 被动型:当前IO不希望主动发送心跳请求,但是当接受到一个心跳请求后,那么该心跳反馈也会立即发出。
针对被动型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)必须反馈null 与 getResponse ( IoSession session, Object request)必须反馈non-null.
4, deaf speaker 聋子型: 当前IO会主动发送心跳请求,但是不想发送任何心跳反馈。
针对聋子型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)必须反馈non-null与 getResponse ( IoSession session, Object request)必须反馈null,将KeepAliveRequestTimeoutHandler 设置为DEAF_SPEAKER.
5, sient-listener 持续监听型:既不想发送心跳请求也不想发送心跳反馈。
针对持续监听型心跳机制: KeepAliveMessageFactory 类的实现方法中: getRequest ( IoSession session)必须反馈null 与 getResponse ( IoSession session, Object request)必须反馈null.
心跳包请求超时后的处理机制:接口 KeepAliveRequestTimeoutHandler ,一般该处理主要是针对能够发送心跳请求的心跳机制。
1.CLOSE:关闭连接
2,LOG:输出 警告信息
3,NOOP:不做任何处理
4,EXCEPTION:抛出异常
5,DEAF_SPEAKER:一个特殊的处理,停止当前过滤器对对心跳反馈监听,因此让过滤器丢失请求超时的侦测功能。(让其变成聋子)
6,keepAliveRequestTimeout(KeepAliveFilter filter, IoSession session); 自定义处理
下面对客户端与服务端和分别举个例子:
服务器:
以被动型心跳机制为例,服务器在接受到客户端连接以后被动接受心跳请求,当在规定时间内没有收到客户端心跳请求时 将客户端连接关闭
主要代码如下:
KeepAliveMessageFactoryImpl kamfi = new KeepAliveMessageFactoryImpl();
实现 方法: public boolean isRequest(IoSession session, Object message):判断是否心跳请求包 是的话返回true
public boolean isResponse(IoSession session, Object message):由于被动型心跳机制,没有请求当然也就不关注反馈 因此直接返回false
public Object getRequest(IoSession session): 被动型心跳机制无请求 因此直接返回null
public Object getResponse(IoSession session, Object request) : 根据心跳请求request 反回一个心跳反馈消息 non-nul
说明: KeepAliveMessageFactoryImpl 为 KeepAliveMessageFactory的一个实现类,其中的实现方法满足被动型心跳机制。
实现 方法: public boolean isRequest(IoSession session, Object message):判断是否心跳请求包 是的话返回true
public boolean isResponse(IoSession session, Object message):由于被动型心跳机制,没有请求当然也就不关注反馈 因此直接返回false
public Object getRequest(IoSession session): 被动型心跳机制无请求 因此直接返回null
public Object getResponse(IoSession session, Object request) : 根据心跳请求request 反回一个心跳反馈消息 non-nul
说明: KeepAliveMessageFactoryImpl 为 KeepAliveMessageFactory的一个实现类,其中的实现方法满足被动型心跳机制。
KeepAliveFilter kaf = new KeepAliveFilter(kamfi, IdleStatus.BOTH_IDLE);
说明:实例化一个 KeepAliveFilter 过滤器,传入 KeepAliveMessageFactory引用,IdleStatus参数为 BOTH_IDLE,及表明如果当前连接的读写通道都空闲的时候在指定的时间间隔getRequestInterval后发送出发Idle事件。
说明:实例化一个 KeepAliveFilter 过滤器,传入 KeepAliveMessageFactory引用,IdleStatus参数为 BOTH_IDLE,及表明如果当前连接的读写通道都空闲的时候在指定的时间间隔getRequestInterval后发送出发Idle事件。
kaf.setForwardEvent(true); //idle事件回发 当session进入idle状态的时候 依然调用handler中的idled方法
说明:尤其 注意该句话,使用了 KeepAliveFilter之后,IoHandlerAdapter中的 sessionIdle方法默认是不会再被调用的! 所以必须加入这句话 sessionIdle才会被调用
说明:尤其 注意该句话,使用了 KeepAliveFilter之后,IoHandlerAdapter中的 sessionIdle方法默认是不会再被调用的! 所以必须加入这句话 sessionIdle才会被调用
kaf.setRequestInterval(heartPeriod); //本服务器为被定型心跳 即需要每10秒接受一个心跳请求 否则该连接进入空闲状态 并且发出idled方法回调
说明:设置心跳包请求时间间隔,其实对于被动型的心跳机制来说,设置心跳包请求间隔貌似是没有用的,因为它是不会发送心跳包的,但是它会触发 sessionIdle事件, 我们利用该方法,可以来判断客户端是否在该时间间隔内没有发心跳包,一旦 sessionIdle方法被调用,则认为 客户端丢失连接并将其踢出 。因此其中参数 heartPeriod其实就是服务器对于客户端的IDLE监控时间。
说明:设置心跳包请求时间间隔,其实对于被动型的心跳机制来说,设置心跳包请求间隔貌似是没有用的,因为它是不会发送心跳包的,但是它会触发 sessionIdle事件, 我们利用该方法,可以来判断客户端是否在该时间间隔内没有发心跳包,一旦 sessionIdle方法被调用,则认为 客户端丢失连接并将其踢出 。因此其中参数 heartPeriod其实就是服务器对于客户端的IDLE监控时间。
//kaf.setRequestTimeout(5); //超时时间 如果当前发出一个心跳请求后需要反馈 若反馈超过此事件 默认则关闭连接
acceptor.getFilterChain().addLast("heart", kaf);
说明: 该过滤器加入到整个通信的过滤链中。
客户端:
客户端会定时发送心跳请求(注意定时时间必须小于,服务器端的IDLE监控时间),同时需要监听心跳反馈,以此来判断是否与服务器丢失连接。对于服务器的心跳请求不给与反馈。
主要代码如下:
说明: 该过滤器加入到整个通信的过滤链中。
客户端:
客户端会定时发送心跳请求(注意定时时间必须小于,服务器端的IDLE监控时间),同时需要监听心跳反馈,以此来判断是否与服务器丢失连接。对于服务器的心跳请求不给与反馈。
主要代码如下:
ClientKeepAliveFactoryImpl ckafi = new ClientKeepAliveFactoryImpl();
实现 方法: public boolean isRequest(IoSession session, Object message): 服务器不会给客户端发送请求包,因此不关注请求包,直接返回false
public boolean isResponse(IoSession session, Object message):客户端关注请求反馈,因此判断mesaage是否是反馈包
public Object getRequest(IoSession session): 获取心跳请求包 non-null
public Object getResponse(IoSession session, Object request) : 服务器不会给客户端发送心跳请求,客户端当然也不用反馈 该方法返回null
说明: ClientKeepAliveFactoryImpl 为 KeepAliveMessageFactory的一个实现类。
KeepAliveFilter kaf = new KeepAliveFilter(ckafi, IdleStatus.READER_IDLE,KeepAliveRequestTimeoutHandler.CLOSE);
说明:实例化一个 KeepAliveFilter 过滤器,传入 KeepAliveMessageFactory引用,IdleStatus参数为 READER_IDLE ,及表明如果当前连接的读通道空闲的时候在指定的时间间隔getRequestInterval后发送出心跳请求,以及发出Idle事件。 KeepAliveRequestTimeoutHandler设置为CLOS表明,当发出的心跳请求在规定时间内没有接受到反馈的时候则调用CLOSE方式 关闭连接
kaf.setForwardEvent(true);
说明:继续调用 IoHandlerAdapter 中的 sessionIdle时间
kaf.setRequestInterval(HEART_INTERVAL);
说明:设置当连接的读取通道空闲的时候,心跳包请求时间间隔
kaf.setRequestTimeout(HEART_TIMEOUT);
说明:设置心跳包请求后 等待反馈超时时间。 超过该时间后则调用KeepAliveRequestTimeoutHandler.CLOSE
connector.getFilterChain().addLast("heart", kaf);
说明: 该过滤器加入到整个通信的过滤链中。 实现 方法: public boolean isRequest(IoSession session, Object message): 服务器不会给客户端发送请求包,因此不关注请求包,直接返回false
public boolean isResponse(IoSession session, Object message):客户端关注请求反馈,因此判断mesaage是否是反馈包
public Object getRequest(IoSession session): 获取心跳请求包 non-null
public Object getResponse(IoSession session, Object request) : 服务器不会给客户端发送心跳请求,客户端当然也不用反馈 该方法返回null
说明: ClientKeepAliveFactoryImpl 为 KeepAliveMessageFactory的一个实现类。
KeepAliveFilter kaf = new KeepAliveFilter(ckafi, IdleStatus.READER_IDLE,KeepAliveRequestTimeoutHandler.CLOSE);
说明:实例化一个 KeepAliveFilter 过滤器,传入 KeepAliveMessageFactory引用,IdleStatus参数为 READER_IDLE ,及表明如果当前连接的读通道空闲的时候在指定的时间间隔getRequestInterval后发送出心跳请求,以及发出Idle事件。 KeepAliveRequestTimeoutHandler设置为CLOS表明,当发出的心跳请求在规定时间内没有接受到反馈的时候则调用CLOSE方式 关闭连接
kaf.setForwardEvent(true);
说明:继续调用 IoHandlerAdapter 中的 sessionIdle时间
kaf.setRequestInterval(HEART_INTERVAL);
说明:设置当连接的读取通道空闲的时候,心跳包请求时间间隔
kaf.setRequestTimeout(HEART_TIMEOUT);
说明:设置心跳包请求后 等待反馈超时时间。 超过该时间后则调用KeepAliveRequestTimeoutHandler.CLOSE
connector.getFilterChain().addLast("heart", kaf);
相关推荐
在标题“MINA 心跳协议Demo”中提到的“心跳协议”,在分布式系统和网络通信中是至关重要的一个概念。心跳协议主要用于确保连接的活跃性,检测并处理网络中断或长时间无数据交换导致的假死情况。MINA框架提供了心跳...
mina心跳包机制是Apache Mina框架中的一个关键特性,它用于维持网络连接的活跃状态,确保数据能够在客户端和服务端之间顺畅地传输。Mina是一个高度可扩展的Java网络应用框架,广泛应用于各种分布式系统和网络服务,...
在Mina框架中,心跳机制扮演着至关重要的角色,它确保了网络连接的健康性和可靠性。心跳机制是网络通信中的一个基本概念,主要用来检测客户端与服务器之间的连接是否依然活跃,防止因网络延迟或数据包丢失导致的假死...
在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina连接"。在Mina中,连接是指客户端与服务端之间建立的通信链路。它支持多种传输协议,如TCP/IP(Socket)...
2. **心跳消息创建**:心跳消息通常是一个特殊的协议数据单元(PDU),其内容可以是预定义的字符串或者特定的字节序列。MINA允许开发者自定义心跳消息的格式和内容。 3. **心跳发送**:心跳消息通过MINA的事件驱动...
mina仿qq聊天功能,自定义协议,协议的编码和解码详解,发送xml对象json,mina开发大全,详细api ...mina开发的在线聊天工具,mina仿qq功能,mina自定义协议,可以仿http请求,mina心跳等技术大全,mina功能大揭密
mina带心跳长链接,可实现服务间通信。socket长连接实现客户端与服务端的通信。对于通信技术学习是非常好的资料。改造后可实现企业应用
**Mina自定义协议简单实现** Apache Mina(Minimum Asynchronous Network)是一个开源的网络通信框架,它为Java开发者提供了一种高效、灵活且可扩展的框架,用于构建高性能的网络应用程序,如服务器和客户端应用。...
mina通信协议文档及实例,内含说明文档及实例,长短连接
mina 协议 解包 粘包
Apache MINA 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。Apache MINA 可以作为开发网络应用...
《mina HTTP协议实例详解》 在信息技术领域,网络通信是不可或缺的一部分,而HTTP协议作为互联网上应用最广泛的一种网络协议,对于开发人员来说至关重要。Apache MINA(Multipurpose Infrastructure for Network ...
在IT行业中,网络通信是核心领域之一,而Mina(Mindterm In Action Network Application)是一个高性能、跨平台的Java框架,常用于构建网络应用程序,如服务器和客户端。本示例聚焦于Mina中的自定义协议通信,这允许...
标题中的“给予mina协议进行大数据传输”指的是一种基于Java的网络通信框架——Apache MINA(Model-View-Controller for Network Applications)。MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高...
过滤器链的概念是MINA框架的核心特性之一,它允许开发者插入自定义的过滤器来处理进来的数据或者发送出去的数据。协议解码过滤器(ProtocolDecoderFilter)就是这样的一个过滤器,它的主要任务是从接收到的原始字节...
Mina是一个轻量级、高性能的网络应用框架,主要用于构建服务器端的网络应用,如TCP/IP和UDP协议的服务。而SpringBoot是基于Spring框架的微服务开发工具,简化了Spring应用的初始搭建以及开发过程。下面我们将详细...
这是一个有关Mina在Java通信中运用的简单的入门实例,MIna自带一种触发机制,无需再开线程等待收发数据。这个实例中有客户端和服务端,与软件TCPUDPDbg进行文字通话测试。用的时候注意添加Mina包,此实例中用到的是...
《Mina开发之客户端详解》 Apache Mina(Minimum Asynchronous Network)是一个高度可扩展的、高性能的网络应用框架,主要用于构建服务器端的网络应用程序。它简化了网络编程的复杂性,提供了基于事件驱动和异步I/O...
Mina提供了丰富的API和工具,简化了网络编程的复杂性,使得开发者可以专注于业务逻辑,而无需深入理解底层网络协议的实现细节。 在"实现了Mina框架简单的换行符编解码的服务器客户端通信"这一描述中,我们可以理解...
1. **Filter Chain**:Mina的核心设计模式之一是过滤器链。每个连接都有一系列过滤器,它们按照顺序处理入站和出站事件。过滤器可以实现特定功能,如数据编码解码、安全验证、性能监控等。 2. **Session**:Session...