MINA源码分析1-服务端启动和客户端调用
2014-04-25 12:08
411 查看
最近由于需要使用MINA框架进行项目开发,所以研究了MINA框架源码,现在我从服务端启动和客户端调用为入口进行分享。
1:需要的jar包:
由于使用了json数据解析,数据库操作和日志管理所以有了这些相关jar.
2:服务器端:
/**
*模拟终端访问MINA服务器
1:需要的jar包:
由于使用了json数据解析,数据库操作和日志管理所以有了这些相关jar.
2:服务器端:
MinaServer.java服务器启动
/** *启动MINA服务入口 *1.向终端提供socket连接. *2.心跳监听. *3.线程池处理. *@version:V1.0 */ publicclassMinaServer{ privatestaticLoggerlogger=Logger.getLogger(MinaServer.class); //服务器端绑定的端口 privatestaticfinalintPORT=8090; //30秒后超时 privatestaticfinalintIDELTIMEOUT=30; /** *main函数,启动服务入口 */ publicstaticvoidmain(Stringargs[]){ startMinaServer(); } /** *启动MIMA服务 *@Function:startMinaServer *@Description:启动MIMA服务 */ publicstaticvoidstartMinaServer(){ IoAcceptoracceptor=null; try{ //创建一个非阻塞的Server端Socket acceptor=newNioSocketAcceptor(Runtime.getRuntime().availableProcessors()+1); //创建接收数据的过滤器 DefaultIoFilterChainBuilderchain=acceptor.getFilterChain(); //建立线程池 ExecutorthreadPool=Executors.newCachedThreadPool(); //加入过滤器(Filter)到Acceptor chain.addLast("threadPool",newExecutorFilter(threadPool)); //设置读取数据的缓冲区大小 acceptor.getSessionConfig().setReadBufferSize(1024*2); //心跳 //chain.addLast("keep-alive",newKeepAliveFilterInMina()); //读写通道30秒内无操作进入空闲状态 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,IDELTIMEOUT); //设定服务器端的消息处理器:一个MinaServerHandler对象, acceptor.setHandler(newMinaServerHandler()); //绑定端口,启动服务器 acceptor.bind(newInetSocketAddress(PORT)); logger.info("IRStatiom服务端启动成功...端口号为:"+PORT); }catch(Exceptione){ logger.error("服务端启动异常....",e); e.printStackTrace(); } } }
MinaServerHandler.java消息处理器
/** *消息处理器:处理接收到得信息. *1.处理终端连接成信息. *2.连接异常处理. *@version:V1.0 */ publicclassMinaServerHandlerextendsIoHandlerAdapter{ privatestaticLoggerlogger=Logger.getLogger(MinaServerHandler.class); privateIUserManageuserManage=newUserManageImpl(); /** *当客户端发送消息到达时 */ publicvoidmessageReceived(IoSessionsession,Objectmessage)throwsException{ logger.info("服务端接受到请求."); } /** *当有异常发生时触发 */ @Override publicvoidexceptionCaught(IoSessionsession,Throwablecause){ cause.printStackTrace(); } } /** *Sent */ publicvoidmessageSent(IoSessionsession,Objectmessage)throwsException{ logger.info("服务端---->session:"+session.getId()+",messageSent"); } /** *连接被关闭时触发 */ publicvoidsessionClosed(IoSessionsession)throwsException{ userManage.delSessionId(session.getId()); logger.info("服务端--->session:"+session.getId()+",sessionClosed:"); } /** *Created */ @Override publicvoidsessionCreated(IoSessionsession)throwsException{ logger.info("服务端--->session:"+session.getId()+",sessionCreated"); } /** *当新客户端连接时调用 */ publicvoidsessionOpened(IoSessionsession)throwsException{ logger.info("服务端--->session:"+session.getId()+",Open"); } }
3:客户端请求:
MinaClient.java客户端访问MINA服务器
/**
*模拟终端访问MINA服务器
*@version:V1.0
*@description:
*/
publicclassMinaClient{
privatestaticLoggerlogger=Logger.getLogger(MinaClient.class);
/**
*请求NIMA服务器IP
*/
privatestaticStringHOST="ip";
/**
*请求MINA服务器端口
*/
privatestaticintPORT=8090;
/**
*MINA连接
*/
privateNioSocketConnectorconnector;
/**
*MINA连接
*/
privateConnectFuturecf;
/**
*会话session
*/
privateIoSessionsession;
/**发送一次心跳包的时间秒为单位*/
privatestaticfinalintHEARTBEATRATE=30;
/**
*模拟单个终端请求
*/
publicstaticvoidmain(String[]args)throwsIOException{
MinaClientclient=newMinaClient();
client.start();
client.send(StringUtils.getByteData(15));
client.close();
}
/**
*启动NIMA客户端
*@Function:start
*@Description:启动NIMA客户端
*@returnvaluedescription
*@exception/throwsdescription
*/
publicvoidstart()throwsIOException{
//创建TCP/IPconnector.
connector=newNioSocketConnector();
//创建接收数据的过滤器
//DefaultIoFilterChainBuilderchain=connector.getFilterChain();
/******************结束*********************/
//设定服务器端的消息处理器:一个MinaClientHandler对象
connector.setHandler(newMinaClientHandler());
//Setconnecttimeout.
connector.setConnectTimeout(30);
//连结到服务器:
cf=connector.connect(newInetSocketAddress(HOST,PORT));
//等待连接创建完成
cf.awaitUninterruptibly();
//获取当前session
session=cf.getSession();
}
publicvoidsetAttribute(Objectkey,Objectvalue){
session.setAttribute(key,value);
}
/**
*发送二进制数据
*@Function:send
*@Description:发送二进制数据
*@paramb二进制数据
*@returnvaluedescription
*@exception/throwsdescription
*/
publicvoidsend(byte[]b){
session.write(IoBuffer.wrap(b));
}
/**
*关闭MINA连接
*@Function:close
*@Description:关闭NIMA连接
*@returnvaluedescription
*@exception/throwsdescription
*/
publicbooleanclose(){
CloseFuturefuture=session.getCloseFuture();
future.awaitUninterruptibly(1000);
connector.dispose();
returntrue;
}
/**
*获取Socket连接
*@Function:getConnector
*@Description:获取Socket连接
*@returnvaluedescription
*@exception/throwsdescription
*/
publicSocketConnectorgetConnector(){
returnconnector;
}
/**
*获取会话IoSession
*/
publicIoSessiongetSession(){
returnsession;
}
MinaClientHandler.java
publicclassMinaClientHandlerextendsIoHandlerAdapter{
privatestaticLoggerlogger=Logger.getLogger(MinaClientHandler.class);
/**
*当客户端发送的消息到达时
*/
@Override
publicvoidmessageReceived(IoSessionsession,Objectmessage)
throwsException{
logger.info("客户端->messageReceived");
}
@Override
publicvoidmessageSent(IoSessionsession,Objectmessage)throwsException{
super.messageSent(session,message);
logger.info("客户端->messageSent");
}
@Override
publicvoidsessionClosed(IoSessionsession)throwsException{
logger.info("客户端->sessionClosed");
}
@Override
publicvoidsessionCreated(IoSessionsession)throwsException{
logger.info("客户端->sessionCreated");
}
@Override
publicvoidsessionOpened(IoSessionsession)throwsException{
logger.info("客户端->sessionOpened");
}
}
相关文章推荐
- dubbo源码分析-客户端DubboInvoker调用服务端体会Netty的非阻塞IO使用
- Netty源码分析之客户端启动过程
- HDFS-源码分析(2)——客户端和服务端
- Netty系列-客户端启动源码分析
- [netty源码分析]--服务端启动的工作流程分析
- Netty4 服务端启动源码分析-线程的创建
- Netty5源码分析--2.客户端启动过程
- 开源中国 OsChina Android 客户端源码分析(1)启动界面 app_start
- motan源码分析四:客户端调用服务
- motan源码分析八:涉及到底层的客户端调用
- [Mina2.0源码](六)服务端、客户端读数据
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
- Fresco 源码分析(二) Fresco客户端与服务端交互(2) Fresco.initializeDrawee()分析 续
- netty源码分析之服务端启动
- zookeeper源码阅读分析笔记--客户端服务端通信机制以及session超时、过期处理
- Fresco 源码分析(二) Fresco客户端与服务端交互(3) 前后台打通
- MySQL源码分析及核心内幕之4 -- 源码服务端main函数开始及启动流程
- 关于MINA服务端源码分析
- MINA源码分析---对客户端设置连接间隔时间的过滤器
- Netty5源码分析--1.服务端启动过程详解