您的位置:首页 > 其它

MINA源码分析1-服务端启动和客户端调用

2014-04-25 12:08 411 查看
最近由于需要使用MINA框架进行项目开发,所以研究了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");
}

}










                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: