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

最近由于需要使用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");  
    }  

}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值