最近由于需要使用MINA框架进行项目开发,所以研究了MINA框架源码,现在我从服务端启动和客户端调用为入口进行分享。
1: 需要的jar包:
由于使用了json数据解析,数据库操作和日志管理所以有了这些相关jar.
2: 服务器端:
MinaServer.java 服务器启动
/**
* 启动MINA服务入口
* 1.向终端提供socket连接.
* 2.心跳监听.
* 3.线程池处理.
* @version : V1.0
*/
public class MinaServer {
private static Logger logger = Logger.getLogger(MinaServer.class);
//服务器端绑定的端口
private static final int PORT = 8090;
//30秒后超时
private static final int IDELTIMEOUT = 30;
/**
* main函数,启动服务入口
*/
public static void main(String args[]) {
startMinaServer();
}
/**
* 启动MIMA服务
* @Function:startMinaServer
* @Description:启动MIMA服务
*/
public static void startMinaServer() {
IoAcceptor acceptor = null;
try {
//创建一个非阻塞的Server端Socket
acceptor = new NioSocketAcceptor(Runtime.getRuntime().availableProcessors() + 1);
//创建接收数据的过滤器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//建立线程池
Executor threadPool = Executors.newCachedThreadPool();
//加入过滤器(Filter)到Acceptor
chain.addLast("threadPool", new ExecutorFilter(threadPool));
//设置读取数据的缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(1024*2);
//心跳
//chain.addLast("keep-alive", new KeepAliveFilterInMina());
//读写通道30秒内无操作进入空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, IDELTIMEOUT);
//设定服务器端的消息处理器:一个MinaServerHandler对象,
acceptor.setHandler(new MinaServerHandler());
//绑定端口,启动服务器
acceptor.bind(new InetSocketAddress(PORT));
logger.info("IRStatiom服务端启动成功... 端口号为:" + PORT);
} catch (Exception e) {
logger.error("服务端启动异常....", e);
e.printStackTrace();
}
}
}
MinaServerHandler.java 消息处理器
/** * 消息处理器:处理接收到得信息. * 1.处理终端连接成信息. * 2.连接异常处理. * @version : V1.0 */ public class MinaServerHandler extends IoHandlerAdapter { private static Logger logger = Logger.getLogger(MinaServerHandler.class); private IUserManage userManage = new UserManageImpl(); /** * 当客户端发送消息到达时 */ public void messageReceived(IoSession session, Object message) throws Exception { logger.info("服务端接受到请求."); } /** * 当有异常发生时触发 */ @Override public void exceptionCaught(IoSession session, Throwable cause) { cause.printStackTrace(); } } /** * Sent */ public void messageSent(IoSession session, Object message) throws Exception { logger.info("服务端---->session:" + session.getId() + ",messageSent"); } /** * 连接被关闭时触发 */ public void sessionClosed(IoSession session) throws Exception { userManage.delSessionId(session.getId()); logger.info("服务端--->session:" + session.getId() + ",sessionClosed:"); } /** * Created */ @Override public void sessionCreated(IoSession session) throws Exception { logger.info("服务端--->session:" + session.getId() + ",sessionCreated"); } /** * 当新客户端连接时调用 */ public void sessionOpened(IoSession session) throws Exception { logger.info("服务端--->session:" + session.getId() + ",Open"); } }
3:客户端请求:
MinaClient.java 客户端访问MINA服务器/**
* 模拟终端访问MINA服务器
* @version : V1.0 * @description : */ public class MinaClient { private static Logger logger = Logger.getLogger(MinaClient.class); /** * 请求NIMA服务器IP */ private static String HOST = "ip"; /** * 请求MINA服务器端口 */ private static int PORT = 8090; /** * MINA连接 */ private NioSocketConnector connector; /** * MINA连接 */ private ConnectFuture cf; /** * 会话session */ private IoSession session; /** 发送一次心跳包 的时间秒为单位*/ private static final int HEARTBEATRATE = 30; /** * 模拟单个终端请求 */ public static void main(String[] args) throws IOException { MinaClient client = new MinaClient(); client.start(); client.send(StringUtils.getByteData(15)); client.close(); } /** * 启动NIMA客户端 * @Function:start * @Description:启动NIMA客户端 * @return value description * @exception/throws description */ public void start() throws IOException { // 创建 TCP/IP connector. connector = new NioSocketConnector(); // 创建接收数据的过滤器 //DefaultIoFilterChainBuilder chain = connector.getFilterChain(); /******************结束*********************/ //设定服务器端的消息处理器:一个MinaClientHandler对象 connector.setHandler(new MinaClientHandler()); // Set connect timeout. connector.setConnectTimeout(30); //连结到服务器: cf = connector.connect(new InetSocketAddress(HOST, PORT)); // 等待连接创建完成 cf.awaitUninterruptibly(); // 获取当前session session = cf.getSession(); } public void setAttribute(Object key, Object value) { session.setAttribute(key, value); } /** * 发送二进制数据 * @Function:send * @Description:发送二进制数据 * @param b 二进制数据 * @return value description * @exception/throws description */ public void send(byte[] b) { session.write(IoBuffer.wrap(b)); } /** * 关闭MINA连接 * @Function:close * @Description:关闭NIMA连接 * @return value description * @exception/throws description */ public boolean close() { CloseFuture future = session.getCloseFuture(); future.awaitUninterruptibly(1000); connector.dispose(); return true; } /** * 获取Socket连接 * @Function:getConnector * @Description:获取Socket连接 * @return value description * @exception/throws description */ public SocketConnector getConnector() { return connector; } /** * 获取会话IoSession */ public IoSession getSession() { return session; }
MinaClientHandler.java
public class MinaClientHandler extends IoHandlerAdapter { private static Logger logger = Logger.getLogger(MinaClientHandler.class); /** * 当客户端发送的消息到达时 */ @Override public void messageReceived(IoSession session, Object message) throws Exception { logger.info("客户端->messageReceived"); } @Override public void messageSent(IoSession session, Object message) throws Exception { super.messageSent(session, message); logger.info("客户端->messageSent"); } @Override public void sessionClosed(IoSession session) throws Exception { logger.info("客户端->sessionClosed"); } @Override public void sessionCreated(IoSession session) throws Exception { logger.info("客户端->sessionCreated"); } @Override public void sessionOpened(IoSession session) throws Exception { logger.info("客户端->sessionOpened"); } }