最近用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断线重连。其中客户端可直接用在android上。根据各方参考资料,经过自己的理解弄出来的。CSDN的资源分太难得了。
mina客户端,服务器端的demo
项目包含有mina的服务端与客户端,客户端发送心跳包,服务端响应心跳包
运行客户端hello会弹出一个窗体,点击按钮模拟客户端主动发送。只是简单的例子很多没有处理,但是基本的数据连接没有问题
mina客户端示例,包括一些封闭的帮助类,编码器,解码器,用起来也比较简单,本人是打成jar包供其他项目使用的.
Mina网络通信开发Demo,Mina客户端服务器Demo,很好的代码学习资料
mina 长连接 客户端+服务端 实现长连接可以收发消息正确部署可以使用需要的朋友可以下载看看
Mina开发之客户端的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html
NULL 博文链接:https://aniyo.iteye.com/blog/1609337
Mina 服务端客户端示例程序
代码利用mina框架实现了服务器端和客户端,客户端的登录请求、客户端向服务器端请求图片文件的功能。代码分为服务端和客户端,开发环境eclipse。服务器代码可在web项目中使用,客户端代码可以在Android开发时使用,...
该案例实现了最基本的mina通讯,代码一看就懂,配合官网文档,学mina简直不要太轻松!
Android端集成Mina框架实现长连接,完美解决断线重连问题,修复断线重连打开多端口问题.zip
本代码包含mina服务端,同步客户端-即短连接方式,异步客户端-即长连接方式。
Mina开源框架 心跳机制详解
mina客户端的例子,实现了nio,游戏开发,即时通讯工具开发必备例子
mina 心跳
使用MINA自带的心跳协议编写的心跳的Demo
mina2服务端客户端实例,直接导入eclipse项目即可。