Apache MINA简介

简介:
Apache MINA(Multipurpose Infrastructure for Network Applications) 是一个网络应用框架,有助于用户非常方便地开发高性能、高伸缩性的网络应用。它通过Java NIO提供了一个抽象的、事件驱动的、异步的位于各种传输协议(如TCP/IP和UDP/IP)之上的API。

 

Mina 框架:

IoService

IoService是对于服务器端接受连接和客户端发起连接两类行为的一个抽象。IoServer用来执行真正的 I/O 操作,以及管理 I/O 会话。两个子接口为IoAcceptor和IoConnector。IoAcceptor用来接受连接,与客户端进行通讯,并发出相应的 I/O 事件交给 IoPorcessor来处理。IoConnector用来发起连接,与服务端进行通讯,并发出相应的 I/O 事件交给 IoPorcessor来处理。

IoServiceListener

IoServiceListener是IoService的监听器,监听与该IoService相关的所有事件,例如,服务被激活、服务闲置、服务被销毁、会话创建、会话销毁等。

IoSession

IoSession表示一个活动的网络连接,与所使用的传输方式无关。IoSession可以用来存储用户自定义的与应用相关的属性。这些属性通常用来保存应用的状态信息,还可以用来在IoFilter器和IoHandler之间交换数据。

IoProcessor

IoProcessor,负责IoFilter和IoHandler进行具体处理,用于为IoSession执行具体的I/O操作。IoProcessor 负责调用注册在IoService上的过滤器,并在过滤器链之后调用IoHandler。一个Processor可以对应N个IoSessions,一个IoSession总是对应一个IoProcessor。

IoFilter

IoFilter是IoServer和IoHander之间的桥梁,从 I/O 服务发送过来的所有 I/O 事件和请求,在到达 I/O 处理器之前,会先由 I/O 过滤器链中的 I/O 过滤器进行处理,比如记录日志、性能分析、访问控制、负载均衡和消息转换等。
IoHandler

IoHandler负责业务处理的,是I/O事件真正得到处理的地方,包含以下一些方法作为业务处理的扩展点

void exceptionCaught(IoSession session, Throwable cause) 当接口中其他方法抛出异常未被捕获时触发此方法
void messageReceived(IoSession session, Object message) 当接收到客户端的请求信息后触发此方法
void messageSent(IoSession session, Object message) 当信息已经传送给客户端后触发此方法
void sessionClosed(IoSession session) 当连接被关闭时触发,例如客户端程序意外退出等
void sessionCreated(IoSession session) 当一个新客户端连接后触发此方法
void sessionIdle(IoSession session, IdleStatus status) 当连接空闲时触发此方法
void sessionOpened(IoSession session) 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发

准备工作:

org.apache.mina 版本4.0

org.slf4j 1.6.1 (Simple Logging Facade for Java)mina所使用的日志框架,该版本是与mina4.0匹配的版本。

我是用maven管理项目依赖的,使用apache-maven-3.0.4

IDE:IntelliJ IDEA 10.0.3

开始HelloWorld:

1.maven的pom文件:

  1. <?xml version=“1.0″ encoding=“UTF-8″?>  
  2. <project xmlns=“http://maven.apache.org/POM/4.0.0″  
  3.          xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”  
  4.          xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>  
  5.     <modelVersion>4.0.0</modelVersion>  
  6.   
  7.     <groupId>example</groupId>  
  8.     <artifactId>example</artifactId>  
  9.     <version>1.0</version>  
  10.   
  11.     <properties>  
  12.         <project.build.sourceEncoding>GBK</project.build.sourceEncoding>  
  13.     </properties>  
  14.   
  15.     <dependencies>  
  16.         <dependency>  
  17.           <groupId>org.apache.mina</groupId>  
  18.           <artifactId>mina-core</artifactId>  
  19.           <version>2.0.4</version>  
  20.         </dependency>  
  21.   
  22.         <dependency>  
  23.             <groupId>org.slf4j</groupId>  
  24.             <artifactId>jcl-over-slf4j</artifactId>  
  25.             <version>1.6.1</version>  
  26.         </dependency>  
  27.   
  28.         <dependency>  
  29.           <groupId>org.slf4j</groupId>  
  30.           <artifactId>slf4j-nop</artifactId>  
  31.           <version>1.6.1</version>  
  32.         </dependency>  
  33.   
  34.     </dependencies>    
  35.       
  36. </project>  
 
  

 2. 服务器代码:

a) 首先实现服务端的IoHandler代码SimpleMinaServerHandler。主要功能是打印客户端写入的信息,统计客户端的请求次数以及返回当前客户端是第几次访问。

  1. package com.chiyan.apach.mina.server;  
  2.   
  3. import org.apache.mina.core.service.IoHandlerAdapter;  
  4. import org.apache.mina.core.session.IoSession;  
  5.   
  6. import java.util.concurrent.atomic.AtomicInteger;  
  7.   
  8. /** 
  9.  * Created by IntelliJ IDEA. 
  10.  * 简单的消息处理器 
  11.  * User: chiyan 
  12.  * Date: 12-7-19 
  13.  * Time: 上午12:19 
  14.  */  
  15. public class SimpleMinaServerHandler extends IoHandlerAdapter {  
  16.   
  17.     private AtomicInteger count = new AtomicInteger(0);  
  18.   
  19.     /** 
  20.      * 当一个客户端连接进入时 
  21.      */  
  22.     @Override  
  23.     public void sessionOpened(IoSession session) throws Exception {  
  24.   
  25.         System.out.println(“client connection : ” + session.getRemoteAddress());  
  26.   
  27.     }  
  28.   
  29.     /** 
  30.      * 当一个客户端关闭时 
  31.      */  
  32.     @Override  
  33.     public void sessionClosed(IoSession session) throws Exception {  
  34.   
  35.         System.out.println(“client disconnection : ” +session.getRemoteAddress() + “ is Disconnection”);  
  36.   
  37.     }  
  38.   
  39.     /** 
  40.      * 当接收到客户端的信息 
  41.      * 
  42.      * @param session 
  43.      * @param message 
  44.      * @throws Exception 
  45.      */  
  46.     @Override  
  47.     public void messageReceived(IoSession session, Object message)  
  48.             throws Exception {  
  49.   
  50.         String str = (String)message;  
  51.   
  52.         // 打印客户端  
  53.         System.out.println(“receive client message : [ " + str +" ]“);  
  54.   
  55.         // 回写消息给客户端  
  56.         session.write(count.incrementAndGet());  
  57.   
  58.     }  
  59.   
  60. }  
 
  

b) 搭建服务端 MainServer:

  1. package com.chiyan.apach.mina.server;  
  2.   
  3. import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;  
  4. import org.apache.mina.core.session.IdleStatus;  
  5. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  6. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
  7. import org.apache.mina.transport.socket.SocketAcceptor;  
  8. import org.apache.mina.transport.socket.SocketSessionConfig;  
  9. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  10.   
  11. import java.io.IOException;  
  12. import java.net.InetSocketAddress;  
  13.   
  14. /** 
  15.  * Created by IntelliJ IDEA. 
  16.  * User: chiyan 
  17.  * Date: 12-7-19 
  18.  * Time: 上午12:27 
  19.  */  
  20. public class MainServer {  
  21.   
  22.     // 服务器端口  
  23.     private static final int SERVER_PORT = 8899;  
  24.   
  25.     public static void main(String[] args) throws Exception {  
  26.   
  27.         //创建一个非阻塞的Server端Socket,用NIO  
  28.         SocketAcceptor acceptor = new NioSocketAcceptor();  
  29.   
  30.         // 定义每次接收数据大小  
  31.         SocketSessionConfig sessionConfig = acceptor.getSessionConfig();  
  32.         sessionConfig.setReadBufferSize(2048);  
  33.   
  34.         //创建接受数据的过滤器  
  35.         DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();  
  36.   
  37.         //设定这个过滤器将一行一行(/r/n)的读取数据  
  38.         chain.addLast(“myChain”new ProtocolCodecFilter(new TextLineCodecFactory()));  
  39.   
  40.         //设定服务器端的消息处理器: 一个 SimpleMinaServerHandler 对象  
  41.         acceptor.setHandler(new SimpleMinaServerHandler());  
  42.   
  43.         //绑定端口,启动服务器  
  44.         try {  
  45.             acceptor.bind(new InetSocketAddress(SERVER_PORT));  
  46.         } catch (IOException e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.         System.out.println(“Mina server is listing port:” + SERVER_PORT);  
  50.   
  51.     }  
  52.   
  53. }  
 
  

 3. 客户端代码

a)首先实现客户端的IoHandler代码SimpleMinaClientHandler。主要功能是向服务端写消息,接收到服务端计数后再回写服务端。

  1. package com.chiyan.apach.mina.client;  
  2.   
  3. import org.apache.mina.core.service.IoHandlerAdapter;  
  4. import org.apache.mina.core.session.IdleStatus;  
  5. import org.apache.mina.core.session.IoSession;  
  6.   
  7. /** 
  8.  * Created by IntelliJ IDEA. 
  9.  * User: chiyan 
  10.  * Date: 12-7-19 
  11.  * Time: 上午12:31 
  12.  */  
  13. public class SimpleMinaClientHandler extends IoHandlerAdapter {  
  14.   
  15.     /** 
  16.      * 当客户端接受到消息时 
  17.      */  
  18.     @Override  
  19.     public void messageReceived(IoSession session, Object message) throws Exception {  
  20.   
  21.         Integer num = Integer.valueOf((String)message);  
  22.   
  23.         if(num == null || num >10){  
  24.             session.close(true);  
  25.             return;  
  26.         }  
  27.   
  28.         System.out.println(“receive server num : [ " + num + " ]“);  
  29.   
  30.         Thread.sleep(1000);  
  31.   
  32.         session.write(“client received num is : ” + num + “, request next num”);  
  33.   
  34.     }  
  35.   
  36.     /** 
  37.      * 当一个客户端被关闭时 
  38.      */  
  39.     @Override  
  40.     public void sessionClosed(IoSession session) throws Exception {  
  41.         System.out.println(“client disconnect”);  
  42.     }  
  43.   
  44.     /** 
  45.      * 当一个客户端连接进入时 
  46.      */  
  47.     @Override  
  48.     public void sessionOpened(IoSession session) throws Exception {  
  49.   
  50.         System.out.println(“create connection to server :” + session.getRemoteAddress());  
  51.         session.write(“client started”);  
  52.         session.write(“Hello World!”);  
  53.     }  
  54.   
  55. }  
 
  

b)搭建客户端MainClient

  1. package com.chiyan.apach.mina.client;  
  2.   
  3. import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;  
  4. import org.apache.mina.core.future.ConnectFuture;  
  5. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  6. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
  7. import org.apache.mina.transport.socket.nio.NioSocketConnector;  
  8.   
  9. import java.net.InetSocketAddress;  
  10.   
  11. /** 
  12.  * Created by IntelliJ IDEA. 
  13.  * User: chiyan 
  14.  * Date: 12-7-19 
  15.  * Time: 上午12:40 
  16.  */  
  17. public class MainClient {  
  18.   
  19.     /** 
  20.      * 服务器ip 
  21.      */  
  22.     private static final String SERVER_IP=“127.0.0.1″;  
  23.   
  24.     /** 
  25.      * 服务器端口 
  26.      */  
  27.     private static final int SERVER_PORT=8899;  
  28.   
  29.     public static void main(String []args){  
  30.   
  31.         //Create TCP/IP connection  
  32.         NioSocketConnector connector = new NioSocketConnector();  
  33.   
  34.         //创建接受数据的过滤器  
  35.         DefaultIoFilterChainBuilder chain = connector.getFilterChain();  
  36.   
  37.         //设定这个过滤器将一行一行(/r/n)的读取数据  
  38.         chain.addLast(“myChain”new ProtocolCodecFilter(new TextLineCodecFactory()));  
  39.   
  40.         //服务器的消息处理器:一个 SimpleMinaClientHandler 对象  
  41.         connector.setHandler(new SimpleMinaClientHandler());  
  42.   
  43.         //set connect timeout  
  44.         connector.setConnectTimeoutMillis(30 * 1000);  
  45.   
  46.         //连接到服务器:  
  47.         ConnectFuture cf = connector.connect(new InetSocketAddress(SERVER_IP,SERVER_PORT));  
  48.   
  49.         cf.awaitUninterruptibly();  
  50.   
  51.         cf.getSession().getCloseFuture().awaitUninterruptibly();  
  52.           
  53.         connector.dispose();  
  54.     }  
  55. }  
 
  

 运行程序:

1.服务端打印:

  1. Mina server is listing port:8899  
  2. client connection : /127.0.0.1:50497  
  3. receive client message : [ client started ]  
  4. receive client message : [ Hello World! ]  
  5. receive client message : [ client received num is : 1, request next num ]  
  6. receive client message : [ client received num is : 2, request next num ]  
  7. receive client message : [ client received num is : 3, request next num ]  
  8. receive client message : [ client received num is : 4, request next num ]  
  9. receive client message : [ client received num is : 5, request next num ]  
  10. receive client message : [ client received num is : 6, request next num ]  
  11. receive client message : [ client received num is : 7, request next num ]  
  12. receive client message : [ client received num is : 8, request next num ]  
  13. receive client message : [ client received num is : 9, request next num ]  
  14. receive client message : [ client received num is : 10, request next num ]  
  15. client disconnection : /127.0.0.1:50497 is Disconnection  

 2.客户端打印:

  1. create connection to server :/127.0.0.1:8899  
  2. receive server num : [ 1 ]  
  3. receive server num : [ 2 ]  
  4. receive server num : [ 3 ]  
  5. receive server num : [ 4 ]  
  6. receive server num : [ 5 ]  
  7. receive server num : [ 6 ]  
  8. receive server num : [ 7 ]  
  9. receive server num : [ 8 ]  
  10. receive server num : [ 9 ]  
  11. receive server num : [ 10 ]  
  12. client disconnect  

你可能感兴趣的:(apache)