`
w54653520
  • 浏览: 23165 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mina客户端断线重连、心跳设置

 
阅读更多

最近用mina写客户端一点心得,分享下,如果有不对的地方,希望留言更正。

 

编码、解码工厂就不写了,网上有很多。

 

private static NioSocketConnector connector ;
	private static IoSession session;
	
	public static IoSession getIoSession(){
		return session;
	}
	
	public static NioSocketConnector getConnector(){
    	if(null==connector){
    		// 创建非阻塞的server端的Socket连接
    		connector = new NioSocketConnector();
    	}
    	return connector;
    }
  
	
	 public static void clientStart(){
		    // 创建客户端连接器
		    final NioSocketConnector connector = getConnector(); 
		    //添加消息工厂(编码、解码工厂)
		    connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MsgProtocol()));
		    
		    //===============心跳============
		    ClientKeepAliveFactoryImpl cka = new ClientKeepAliveFactoryImpl();
		    KeepAliveFilter kaf = new KeepAliveFilter(cka,IdleStatus.READER_IDLE,KeepAliveRequestTimeoutHandler.CLOSE);//实例化一个 KeepAliveFilter 过滤器
		    kaf.setForwardEvent(true);// 继续调用 IoHandlerAdapter 中的 sessionIdle时间 
		    kaf.setRequestInterval(10); //设置当连接的读取通道空闲的时候,心跳包请求时间间隔 
		    kaf.setRequestTimeout(5); //设置心跳包请求后 等待反馈超时时间。 超过该时间后则调用KeepAliveRequestTimeoutHandler.CLOSE 
		    connector.getFilterChain().addLast("heart",kaf);//该过滤器加入到整个通信的过滤链中
		    //==============心跳--End===========
		    
		    
		    //==============LOG日志=============
		    LoggingFilter loggingFilter = new LoggingFilter();
 		    loggingFilter.setMessageReceivedLogLevel(LogLevel.INFO);
		    loggingFilter.setMessageSentLogLevel(LogLevel.INFO);
		    connector.getFilterChain().addLast("logger", loggingFilter); 
		    //=============LOG日志--End=============
		    
		    
		    connector.getSessionConfig().setReceiveBufferSize(2048*5000);//接收缓冲区1M
		    connector.setConnectTimeoutMillis(30000); // 设置连接超时
		    connector.setHandler(new ClientIoHandler());// 设置消息处理器
//		    ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",9999));// 建立连接
		    
		    
		    //=============添加监控,断线重连============
		    connector.setDefaultRemoteAddress(new InetSocketAddress("localhost",6900));
		    connector.addListener(new IoListener(){
		    	@Override
		    	public void sessionDestroyed(IoSession arg)throws Exception{
		    		for (;;) {
						try {
							Thread.sleep(5000);
							ConnectFuture future = connector.connect();
							future.awaitUninterruptibly();// 等待连接创建完成 
							session = future.getSession();
							if (session.isConnected()) {
								System.out.println("断线重连[" + connector.getDefaultRemoteAddress().getHostName() + ":" + connector.getDefaultRemoteAddress().getPort() + "]成功");
								break;
							}
						} catch (Exception e) {
							System.out.println("重连服务器登录失败,5秒再连接一次:" + e.getMessage());
						}
					}
		    	}
		    });
		    
		    
		    //==================断线重连--End==================
		    
		    for(;;){
		    	try {
					ConnectFuture future = connector.connect();
					future.awaitUninterruptibly();
					session = future.getSession();
					break;
				} catch (Exception e) {
					try {
						 System.out.println("连接服务端失败--等待重新连接服务器" + e.getMessage());  
			             Thread.sleep(5000);// 连接失败后,重连间隔5s  
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
				}
		    }
	 }

 

public class ClientKeepAliveFactoryImpl implements KeepAliveMessageFactory {

	@Override
	public Object getRequest(IoSession session) {
		session.write("心跳");
		return null;
	}

	@Override
	public Object getResponse(IoSession arg0, Object arg1) {
		return null;
	}

	@Override
	public boolean isRequest(IoSession arg0, Object arg1) {
		return false;
	}

	@Override
	public boolean isResponse(IoSession arg0, Object arg1) {
		return false;
	}

 

public class IoListener implements IoServiceListener{

	@Override
	public void serviceActivated(IoService arg0) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void serviceDeactivated(IoService arg0) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void serviceIdle(IoService arg0, IdleStatus arg1) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void sessionCreated(IoSession arg0) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void sessionDestroyed(IoSession arg0) throws Exception {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void sessionClosed(IoSession arg0) throws Exception {
		// TODO Auto-generated method stub
		
	}

}

 

分享到:
评论

相关推荐

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

    在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina连接"。在Mina中,连接是指客户端与服务端之间建立的通信链路。它支持多种传输协议,如TCP/IP(Socket)...

    Android端集成Mina框架实现长连接,完美解决断线重连问题,修复断线重连打开多端口问题.zip

    在Mina中,可以通过心跳机制来检测连接状态,心跳包可以在一定时间内未收到回应时触发重连操作。同时,设置合理的重试策略,如递增延迟重试,避免频繁无效的连接尝试。 多端口问题通常发生在服务器端,如果一个...

    Android Mina框架使用

    - `MinaClient`:客户端实现,包含连接建立、数据发送和接收、断线重连逻辑。 - `MinaServer`:服务端实现,负责接收客户端连接,处理数据并返回响应。 - `Filter链`:自定义过滤器,用于数据的编码、解码、日志...

    Android长连接神器框架Mina之服务器和客户端例子

    在长连接中,需要处理网络抖动、断线重连、心跳维持等问题。Mina提供了一些内置机制,如超时管理、异常处理等,帮助开发者有效地维护长连接。 ### 示例代码 在Android环境下,Mina的使用基本与Java环境相同,但...

    APP断线重连的实现(Mina框架,含服务器端代码)

    实现:手机安卓APP与服务器建立长连接,客户端通过心跳机制保活,并在网络切换比如4G与WiFi的切换以及网络不稳定(服务器坏掉,网卡)造成的长连接断开进行恢复。(模拟了用户登录) 采用框架:服务器端和安卓开发均...

    websocket+java服务器(mina)

    此外,你可能还需要处理断线重连、心跳机制、错误处理等常见问题。 压缩包中的`html`文件可能是用于展示前端聊天界面的HTML和JavaScript代码,这部分通常包括创建WebSocket连接、发送和接收消息的函数,以及用户...

    Android平台MINA框架使用详细解析

    同时,MINA还提供了异常处理机制,当网络异常发生时,会触发相应的事件,开发者可以据此进行错误恢复或重连操作。 在Android Studio环境下开发MINA应用,需要注意Android的多线程模型和资源管理。由于Android主线程...

    mina写的聊天室

    此外,为了保持健壮性和安全性,通常还会包含身份验证、权限控制、心跳检测和断线重连等机制。 总而言之,Mina聊天室是一个利用Apache Mina构建的实时通信应用,它展示了如何利用Mina框架处理网络通信,以及如何与...

    mina 断网 断电

    7. **故障恢复策略**:对于断网情况,服务端可能需要设计重连机制,当网络恢复后,客户端能自动重新连接到服务端。 8. **代码组织**:MinaSample项目可能包含服务端启动类、IoHandler实现、配置文件等,这些都展示...

    高性能网络架构Mina框架 下载

    Mina在设计上充分考虑到了网络通信中的各种异常情况,如断线重连、心跳检测等,并提供了相应的处理机制,确保服务的稳定性和可靠性。 #### 三、Mina框架的核心组件 Mina的核心组件主要包括以下几部分: ##### 3.1...

    基于FLEX,MINA消息推送核心代码

    4. **心跳机制**:为了检测和处理断线情况,消息推送系统通常会采用心跳机制。客户端定期发送心跳消息到服务器,服务器响应确认,确保连接的活跃性。 5. **并发与性能优化**:MINA的非阻塞I/O模型能够有效地处理...

    stock通讯mina

    同时,系统需要有良好的容错机制,如断线重连、错误恢复等,以确保服务的稳定运行。 7. **性能优化**:为了处理大量并发请求并减少延迟,Mina使用非阻塞I/O模型,避免了线程上下文切换带来的开销。此外,还可以通过...

Global site tag (gtag.js) - Google Analytics