IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]Apache Mina的用法

    wangshuxuncom发表于 2015-03-04 13:16:39
    love 0
    Apache MINA是“Multipurpose Infrastructure for Network Applications”的简写,它是用于开发高性能和高可扩展性的网络应用程序的基础框架。该框架有如下优点:
    1、使用该框架来开发的网络应用程序代码结构清晰明了;
    2、该框架完成了底层的线程管理,省去了处理底层I/O和线程并发等复杂工作;
    3、该框架内置的编码器可以满足大多数用户的需求,省去了开发人员对消息进行编码解码的工作;
    4、该框架具有较高的执行效率,具称使用该框架开发服务器程序的性能已经逼近使用 C/C++语言开发的网络服务器程序。
    下面以一个详细的示例来演示一下Apache Mina的用法:
    工程结构如下图:

    限于篇幅,这里只给出上图标出的两个文件中的代码,完整的源码可通过点击本文最下面的超链接下载:

    StartMinaClient.java文件中的代码:

    package com.ghj.packageofclient;
    
    import java.net.InetSocketAddress;
    import java.nio.charset.Charset;
    
    import org.apache.mina.common.CloseFuture;
    import org.apache.mina.common.ConnectFuture;
    import org.apache.mina.common.DefaultIoFilterChainBuilder;
    import org.apache.mina.common.IdleStatus;
    import org.apache.mina.common.IoSession;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
    import org.apache.mina.filter.logging.LoggingFilter;
    import org.apache.mina.transport.socket.nio.NioSocketConnector;
    
    /**
     * 启动mina客户端
     * 
     * @author 高焕杰
     */
    public class StartMinaClient {
    
    	public static void main(String[] args) {
    
    		NioSocketConnector connector = new NioSocketConnector();//创建客户端连接器
    		DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();
    		filterChain.addLast("logger", new LoggingFilter());//设置日志工厂过滤器
    		filterChain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));//设置文本编解码过滤器
    		connector.setConnectTimeout(3000);//设置连接超时时间(单位毫秒)
    		connector.setHandler(new ClientHandlerAdapter());//设置事件处理器
    		connector.getSessionConfig().setReadBufferSize(1024);//设置读缓冲区大小  
    		connector.getSessionConfig().setWriteTimeout(1000); //设置写操作的超时时间 
    		connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);//第一个参数用于指定空闲状态,第二个参数用于指定Session的闲置时间(单位秒),此处含义为:读写 通道均在3 秒内无任何操作就进入空闲状态
    		ConnectFuture connectFuture = connector.connect(new InetSocketAddress("127.0.0.1",	9123));//建立连接
    		connectFuture.awaitUninterruptibly();//等待连接创建完成
    		IoSession session = connectFuture.getSession();//保存会话属性和发送消息
    		session.write("你好 Apache Mina服务器端!!!");//发送消息
    		session.write("quit"); //发送消息
    		CloseFuture future = session.getCloseFuture();
    		future.awaitUninterruptibly();//等待连接断开
    		future.awaitUninterruptibly(1000);//等待连接断开
    		connector.dispose();
    	}
    }

    StartMinaServer.java文件中的代码:

    package com.ghj.packageofserver;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.charset.Charset;
    
    import org.apache.mina.common.DefaultIoFilterChainBuilder;
    import org.apache.mina.common.IdleStatus;
    import org.apache.mina.common.IoAcceptor;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
    import org.apache.mina.filter.logging.LoggingFilter;
    import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
    
    /**
     * 启动mina服务端
     * 
     * @author 高焕杰
     */
    public class StartMinaServer {
    
    	public static void main(String[] args) {
    
    		IoAcceptor acceptor = new NioSocketAcceptor();//创建服务端监听
    		acceptor.setHandler(new ServerHandlerAdapter());//为该acceptor设置用于业务处理的Hanlder实例
    		acceptor.getSessionConfig().setReadBufferSize(1024);//设置读缓冲区大小  
    	    acceptor.getSessionConfig().setWriteTimeout(1000); //设置写操作的超时时间 
    		DefaultIoFilterChainBuilder filterChain = acceptor.getFilterChain();
    		filterChain.addLast("logger", new LoggingFilter());//设置日志工厂过滤器
    		filterChain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));//设置文本编解码过滤器
    		acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);//第一个参数用于指定空闲状态,第二个参数用于指定Session的闲置时间(单位秒),此处含义为:读写 通道均在3 秒内无任何操作就进入空闲状态
    		try {
    			acceptor.bind(new InetSocketAddress(9123));//绑定监听端口
    			System.out.println("服务器启动成功");
    		} catch (IOException e) {
    			System.out.println("服务器启动失败");
    			e.printStackTrace();
    		}
    	}
    }
    【0分下载该示例代码】



沪ICP备19023445号-2号
友情链接