最近用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中,连接是指客户端与服务端之间建立的通信链路。它支持多种传输协议,如TCP/IP(Socket)...
在Mina中,可以通过心跳机制来检测连接状态,心跳包可以在一定时间内未收到回应时触发重连操作。同时,设置合理的重试策略,如递增延迟重试,避免频繁无效的连接尝试。 多端口问题通常发生在服务器端,如果一个...
- `MinaClient`:客户端实现,包含连接建立、数据发送和接收、断线重连逻辑。 - `MinaServer`:服务端实现,负责接收客户端连接,处理数据并返回响应。 - `Filter链`:自定义过滤器,用于数据的编码、解码、日志...
在长连接中,需要处理网络抖动、断线重连、心跳维持等问题。Mina提供了一些内置机制,如超时管理、异常处理等,帮助开发者有效地维护长连接。 ### 示例代码 在Android环境下,Mina的使用基本与Java环境相同,但...
实现:手机安卓APP与服务器建立长连接,客户端通过心跳机制保活,并在网络切换比如4G与WiFi的切换以及网络不稳定(服务器坏掉,网卡)造成的长连接断开进行恢复。(模拟了用户登录) 采用框架:服务器端和安卓开发均...
此外,你可能还需要处理断线重连、心跳机制、错误处理等常见问题。 压缩包中的`html`文件可能是用于展示前端聊天界面的HTML和JavaScript代码,这部分通常包括创建WebSocket连接、发送和接收消息的函数,以及用户...
同时,MINA还提供了异常处理机制,当网络异常发生时,会触发相应的事件,开发者可以据此进行错误恢复或重连操作。 在Android Studio环境下开发MINA应用,需要注意Android的多线程模型和资源管理。由于Android主线程...
此外,为了保持健壮性和安全性,通常还会包含身份验证、权限控制、心跳检测和断线重连等机制。 总而言之,Mina聊天室是一个利用Apache Mina构建的实时通信应用,它展示了如何利用Mina框架处理网络通信,以及如何与...
7. **故障恢复策略**:对于断网情况,服务端可能需要设计重连机制,当网络恢复后,客户端能自动重新连接到服务端。 8. **代码组织**:MinaSample项目可能包含服务端启动类、IoHandler实现、配置文件等,这些都展示...
Mina在设计上充分考虑到了网络通信中的各种异常情况,如断线重连、心跳检测等,并提供了相应的处理机制,确保服务的稳定性和可靠性。 #### 三、Mina框架的核心组件 Mina的核心组件主要包括以下几部分: ##### 3.1...
4. **心跳机制**:为了检测和处理断线情况,消息推送系统通常会采用心跳机制。客户端定期发送心跳消息到服务器,服务器响应确认,确保连接的活跃性。 5. **并发与性能优化**:MINA的非阻塞I/O模型能够有效地处理...
同时,系统需要有良好的容错机制,如断线重连、错误恢复等,以确保服务的稳定运行。 7. **性能优化**:为了处理大量并发请求并减少延迟,Mina使用非阻塞I/O模型,避免了线程上下文切换带来的开销。此外,还可以通过...