`
wandejun1012
  • 浏览: 2755404 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

mina 心跳机制

    博客分类:
  • mina
 
阅读更多

 MINA自带了对心跳协议的支持,可以对心跳做出细致的配置,本文在次基础上实现了server端对client端的心跳检测。

在开始之前先简单介绍下keepAlive的机制:

首先,需要搞清楚TCP keepalive是干什么用的。从名字理解就能够知道,keepalive就是用来检测一个tcp connection是否还连接正常。当一个tcp connection建立好之后,如果双方都不发送数据的话,tcp协议本身是不会发送其它的任何数据的,也就是说,在一个idle的connection上,两个socket之间不产生任何的数据交换。从另一个方面讲,当一个connection建立之后,链接双方可以长时间的不发送任何数据,比如几天,几星期甚至几个月,但该connection仍然存在。

所以,这就可能出现一个问题。举例来说,server和client建立了一个connection,server负责接收client的request。当connection建立好之后,client由于某种原因机器停机了。但server端并不知道,所以server就会一直监听着这个connection,但其实这个connection已经失效了。

keepalive就是为这样的场景准备的。当把一个socket设置成了keepalive,那么这个socket空闲一段时间后,它就会向对方发送数据来确认对方仍然存在。放在上面的例子中,如果client停机了,那么server所发送的keepalive数据就不会有response,这样server就能够确认client完蛋了(至少从表面上看是这样)。

 

具体的源代码如下:

 Server.java

 

 

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.keepalive.KeepAliveFilter;
import org.apache.mina.filter.keepalive.KeepAliveMessageFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Server {

	private static final int PORT = 9123;
	/** 30秒后超时 */
	private static final int IDELTIMEOUT = 30;
	/** 15秒发送一次心跳包 */
	private static final int HEARTBEATRATE = 15;
	/** 心跳包内容 */
	private static final String HEARTBEATREQUEST = "0x11";
	private static final String HEARTBEATRESPONSE = "0x12";
	private static final Logger LOG = LoggerFactory.getLogger(Server.class);

	public static void main(String[] args) throws IOException {
		IoAcceptor acceptor = new NioSocketAcceptor();
		acceptor.getSessionConfig().setReadBufferSize(1024);
		acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,
				IDELTIMEOUT);
		
		acceptor.getFilterChain().addLast("logger", new LoggingFilter());
		acceptor.getFilterChain().addLast(
				"codec",
				new ProtocolCodecFilter(new TextLineCodecFactory()));

		KeepAliveMessageFactory heartBeatFactory = new KeepAliveMessageFactoryImpl();
		//下面注释掉的是自定义Handler方式
//		KeepAliveRequestTimeoutHandler heartBeatHandler = new 
//								KeepAliveRequestTimeoutHandlerImpl();
//		KeepAliveFilter heartBeat = new KeepAliveFilter(heartBeatFactory,
//				IdleStatus.BOTH_IDLE, heartBeatHandler);
		
		KeepAliveFilter heartBeat = new KeepAliveFilter(heartBeatFactory,
				IdleStatus.BOTH_IDLE);

		//设置是否forward到下一个filter
		heartBeat.setForwardEvent(true);
		//设置心跳频率
		heartBeat.setRequestInterval(HEARTBEATRATE);

		acceptor.getFilterChain().addLast("heartbeat", heartBeat);

		acceptor.setHandler(new MyIoHandler());
		acceptor.bind(new InetSocketAddress(PORT));
		System.out.println("Server started on port: " + PORT);
	}

	/**
	 * @ClassName KeepAliveMessageFactoryImpl
	 * @Description 内部类,实现KeepAliveMessageFactory(心跳工厂)
	 * @author cruise
	 *
	 */
	private static class KeepAliveMessageFactoryImpl implements
			KeepAliveMessageFactory {

		@Override
		public boolean isRequest(IoSession session, Object message) {
			LOG.info("请求心跳包信息: " + message);
			if (message.equals(HEARTBEATREQUEST))
				return true;
			return false;
		}

		@Override
		public boolean isResponse(IoSession session, Object message) {
//			LOG.info("响应心跳包信息: " + message);
//			if(message.equals(HEARTBEATRESPONSE))
//				return true;
			return false;
		}

		@Override
		public Object getRequest(IoSession session) {
			LOG.info("请求预设信息: " + HEARTBEATREQUEST);
			/** 返回预设语句 */
			return HEARTBEATREQUEST;
		}

		@Override
		public Object getResponse(IoSession session, Object request) {
			LOG.info("响应预设信息: " + HEARTBEATRESPONSE);
			/** 返回预设语句 */
			return HEARTBEATRESPONSE;
//			return null;
		}

	}
	
	/**
	 * 对应上面的注释
	 * KeepAliveFilter(heartBeatFactory,IdleStatus.BOTH_IDLE,heartBeatHandler)
	 * 心跳超时处理
	 * KeepAliveFilter 在没有收到心跳消息的响应时,会报告给的KeepAliveRequestTimeoutHandler。
	 * 默认的处理是 KeepAliveRequestTimeoutHandler.CLOSE
	 * (即如果不给handler参数,则会使用默认的从而Close这个Session)
	 * @author cruise
	 *
	 */

//	private static class KeepAliveRequestTimeoutHandlerImpl implements
//			KeepAliveRequestTimeoutHandler {
//
//	
//		@Override
//		public void keepAliveRequestTimedOut(KeepAliveFilter filter,
//				IoSession session) throws Exception {
//			Server.LOG.info("心跳超时!");
//		}
//
//	}
}

 

MyIoHandler.java

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class MyIoHandler extends IoHandlerAdapter{
	private final static Logger log = LoggerFactory
			.getLogger(MyIoHandler.class);

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		String ip = session.getRemoteAddress().toString();
		log.info("===> Message From " + ip + " : " + message);		
	}
	
	

}

  

 

启动Server后,运行telnet客户端连接到Server端,便可以测试心跳;

测试结果如下图:

分享到:
评论

相关推荐

    Mina开源框架 心跳机制详解

    在Mina框架中,心跳机制扮演着至关重要的角色,它确保了网络连接的健康性和可靠性。心跳机制是网络通信中的一个基本概念,主要用来检测客户端与服务器之间的连接是否依然活跃,防止因网络延迟或数据包丢失导致的假死...

    mina心跳包机制

    mina心跳包机制是Apache Mina框架中的一个关键特性,它用于维持网络连接的活跃状态,确保数据能够在客户端和服务端之间顺畅地传输。Mina是一个高度可扩展的Java网络应用框架,广泛应用于各种分布式系统和网络服务,...

    mina连接 mina心跳连接 mina断线重连

    接下来,我们讨论"Mina心跳连接"。心跳机制是保持连接活性的重要手段,特别是在长连接中,防止因网络延迟或服务器无响应导致的假死状态。Mina允许开发者自定义心跳包,通过发送无数据的包或者包含特定标识的数据包,...

    MINA 心跳协议Demo

    MINA框架提供了心跳机制的内置支持,使得开发者可以轻松地在应用中集成这一功能。 在描述中,“使用MINA自带的心跳协议编写的心跳的Demo”表明这是一个演示如何在MINA中实现心跳检查的实际代码示例。通常,心跳协议...

    mina 心跳

    "Mina心跳"是指在MINA框架中实现的一种机制,用于确保网络连接的活跃性和数据传输的可靠性。心跳在分布式系统、网络通信和实时应用程序中扮演着关键角色,因为它们可以检测并处理网络延迟、断开连接或其它通信问题。...

    Mina开发实例(服务端、客户端)DEMO

    通常,心跳机制用于检测连接是否仍然有效,防止因网络问题导致的假死连接。开发者可以通过设置`ReadTimeout`或自定义心跳消息来实现这一功能。 此外,Mina支持多种编码和解码器,如LineDelimiterFilter(按行分割...

    Mina+Socket通信

    Mina提供了丰富的过滤器和事件机制,可以方便地扩展和定制通信行为。而Socket则更底层,需要开发者自行处理这些细节。 文件"MinaSocket"可能包含了实现上述功能的详细代码,包括服务端的Acceptor配置、过滤器设置、...

    MINA长连接框架实现通讯

    7. **异常处理和心跳机制**:为了保证网络连接的稳定性,MINA提供了异常处理机制,当检测到网络异常时,可以及时通知并采取相应的恢复措施。同时,心跳机制(Heartbeat)是长连接中常用的一种维持连接活跃的技术,...

    mina 断包,粘包问题解决

    Apache Mina作为网络通信库,其设计目标是提供高效、稳定的通信机制,但因为TCP协议本身的特性,不可避免地会遇到断包和粘包的问题。为了解决这些问题,Mina提供了一些内置机制,如缓冲区管理和自定义编码解码器。 ...

    Android-MinaSocket一款基于Mina的Socket长连接库

    - **心跳机制**:为了检测连接是否断开,通常需要设置心跳包,定时发送和接收,防止连接因长时间无数据传输而被网络中间设备关闭。 - **线程安全**:在多线程环境下,需确保所有操作都是线程安全的,避免并发问题。...

    Mina入门:mina版之HelloWorld

    **Mina入门:Mina版之HelloWorld** Apache Mina是一个开源...在深入学习Mina时,可以进一步研究它的高级特性,如线程模型、缓冲区管理、心跳机制等,这些都将有助于我们在实际项目中更好地利用Mina提供的强大功能。

    springboot整合mina

    在实际开发中,你可能还需要考虑异常处理、心跳机制、连接管理、性能优化等方面的问题。这些都可以通过Mina提供的API和SpringBoot的特性来进一步完善。记得根据项目需求调整配置和代码,以满足特定场景下的功能需求...

    详解spring集成mina实现服务端主动推送(包含心跳检测)

    心跳检测是Mina中的一种机制,用于检测客户端和服务端之间的连接是否正常。心跳检测可以通过定时器来实现,例如使用ScheduledExecutorService来实现心跳检测。 四、Spring集成Mina的优点 Spring集成Mina可以提供...

    springboot 深度整合mina开箱即用

    - **创建Mina配置类**:定义Mina服务器的配置,包括端口号、心跳间隔等。 - **实现Acceptor**:定义连接接收器,负责处理新进来的连接请求。 - **创建过滤器链**:Mina的过滤器机制允许我们在数据传输过程中进行...

    mina服务器和客服端实现

    - **性能优化**:Mina支持多种优化策略,如缓冲区管理、心跳机制和线程池配置等,可以根据实际需求进行调整。 - **日志与调试**:Mina集成了常见的日志框架,如Log4j和SLF4J,便于追踪程序运行状态。同时,通过...

    mina实现登录功能

    - 调整缓冲区大小、心跳机制等参数,优化网络通信性能。 总之,MINA提供了一套强大的工具,使得开发人员能够专注于业务逻辑,而不是底层的网络通信细节。通过理解和应用上述知识点,我们可以构建出高效、可靠的...

    Mina实现长连接和短连接实例

    在`SessionHandler`中,我们可以设置心跳机制来检测连接是否活跃,防止因网络问题导致的连接超时。 短连接则相对简单,通常适用于一次性或偶尔交互的应用,如HTTP/1.x。在Mina中,短连接的实现只需要在完成数据交换...

    Apache_Mina_Server_2.0_V1.0.rar_apache_apache中文手册_mina

    7. **性能优化**:提供关于如何调整 Mina 配置以提升系统性能的建议,包括线程池设置、缓冲区大小和心跳机制。 8. **案例分析**:可能包含一些实际项目案例,展示如何使用 Mina 构建一个完整的服务器应用。 9. **...

    Mina开发之客户端

    例如,可以使用心跳机制保持长连接的活性,或者使用线程池来优化并发处理能力。 总之,Mina为客户端开发提供了一套强大的工具,通过其灵活的过滤器系统和高效的I/O模型,能够帮助开发者快速构建高性能的网络应用。...

    mina入门实例

    Apache Mina是一个开源框架,主要用于简化网络应用的开发,尤其是基于TCP和UDP协议的应用。...随着深入学习,你可以了解更多的Mina特性,如心跳机制、多线程处理、会话管理等,以构建更复杂、高效的网络应用。

Global site tag (gtag.js) - Google Analytics