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(); } } }
时间: 2024-10-12 17:12:27