mina(一)总结,可用例子

一.MINA框架简介
MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工 作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架当前稳定版本是1.1.6,最新的2.0版本目前 已经发布了M1版本。
MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的 松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容 易。

二.MINA框架的常用类
类NioSocketAcceptor用于创建服务端监听;
类NioSocketConnector用于创建客户端连接;
类IoSession用来保存会话属性和发送消息;
类IoHandlerAdapter用于定义业务逻辑,常用的方法有:
方法 定义
sessionCreated() 当会话创建时被触发
sessionOpened() 当会话开始时被触发
sessionClosed() 当会话关闭时被触发
sessionIdle() 当会话空闲时被触发
exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法
messageRecieved() 当接收到消息后被触发
messageSent() 当发送消息后被触发

三.服务端应用开发示例
  所需jar包slf4j-api.jar、slf4j-jdk14.jar、MINA-core-2.0.0-M6.jar。

1)、首先定义一个业务逻辑处理器TimeServerHandler,继承自IoHandlerAdapter,实现的功能有:当客户端创建会话时会显示客户端设备的IP和端口;当客户端输入quit时结束会话;客户端输入其它内容时则向客户端发送当前时间。代码如下:

TimeServerHandler :

Java代码   收藏代码
  1. import java.util.Date;  
  2.   
  3. import org.apache.mina.core.service.IoHandlerAdapter;  
  4. import org.apache.mina.core.session.IoSession;  
  5.   
  6. public class TimeServerHandler extends IoHandlerAdapter {  
  7.   
  8.     public void sessionCreated(IoSession session) {  
  9.         // 显示客户端的ip和端口  
  10.         System.out.println(session.getRemoteAddress().toString()+"1111111111111");  
  11.     }  
  12.   
  13.     @Override  
  14.     public void messageReceived(IoSession session, Object message)  
  15.             throws Exception {  
  16.         String str = message.toString();  
  17.         System.out.println("str:"+str);  
  18.         if (str.trim().equalsIgnoreCase("quit")) {  
  19.             session.close();  
  20.             // 结束会话return;  
  21.         }  
  22.         Date date = new Date();  
  23.         session.write(date.toString());  
  24.         // 返回当前时间的字符串  
  25.         System.out.println("Message written..."+"2222222222");  
  26.     }  
  27.   
  28.       
  29. }  


MinaTimeServer:

Java代码   收藏代码
  1. import java.io.IOException;  
  2. import java.net.InetSocketAddress;  
  3. import java.nio.charset.Charset;  
  4.   
  5. import org.apache.mina.core.service.IoAcceptor;  
  6. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  7. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
  8. import org.apache.mina.filter.logging.LoggingFilter;  
  9. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  10.   
  11. public class MinaTimeServer {  
  12.   
  13.     private static final int PORT = 9123;// 定义监听端口  
  14.   
  15.     /** 
  16.      * @param args 
  17.      * @throws IOException 
  18.      */  
  19.     public static void main(String[] args) throws IOException {  
  20.         // TODO Auto-generated method stub  
  21.   
  22.         IoAcceptor acceptor = new NioSocketAcceptor();  
  23.         acceptor.getFilterChain().addLast("logger"new LoggingFilter());  
  24.         acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); // 指定编码过滤器  
  25.         acceptor.setHandler(new TimeServerHandler()); // 指定业务逻辑处理器  
  26.         acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT)); // 设置端口号  
  27.         acceptor.bind();// 启动监听}  
  28.     }  
  29.   
  30. }  


2)、客户端代码:

TimeClientHandler:

Java代码   收藏代码
  1. import org.apache.mina.core.service.IoHandlerAdapter;  
  2. import org.apache.mina.core.session.IoSession;  
  3.   
  4. public class TimeClientHandler extends IoHandlerAdapter{  
  5.     public TimeClientHandler() {}  
  6.     @Override  
  7.     public void messageReceived(IoSession session, Object message) throws Exception {  
  8.         System.out.println(message);// 显示接收到的消息  
  9.         }  
  10. }  


MinaTimeClient:

Java代码   收藏代码
  1. import java.net.InetSocketAddress;  
  2. import java.nio.charset.Charset;  
  3. import org.apache.mina.core.future.ConnectFuture;  
  4. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  5. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
  6. import org.apache.mina.filter.logging.LoggingFilter;  
  7. import org.apache.mina.transport.socket.nio.NioSocketConnector;  
  8.   
  9. public class MinaTimeClient {  
  10.   
  11.     /** 
  12.      * @param args 
  13.      */  
  14.     public static void main(String[] args) {  
  15.         // TODO Auto-generated method stub  
  16.         // 创建客户端连接器.  
  17.         NioSocketConnector connector = new NioSocketConnector();  
  18.         connector.getFilterChain().addLast( "logger"new LoggingFilter() );  
  19.         connector.getFilterChain().addLast( "codec"new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));        //设置编码过滤器  
  20.         connector.setConnectTimeout(30);  
  21.         connector.setHandler(new TimeClientHandler());//设置事件处理器  
  22.         ConnectFuture cf = connector.connect(new InetSocketAddress("127.0.0.1"9123));//建立连接  
  23.         cf.awaitUninterruptibly();//等待连接创建完成  
  24.         cf.getSession().write("hello");//发送消息  
  25.         cf.getSession().write("quit");//发送消息  
  26.         cf.getSession().getCloseFuture().awaitUninterruptibly();//等待连接断开  
  27.         connector.dispose();  
  28.     }  
  29.   
  30. }  


*MINA传输对象:

1)、建立两个工程代码组织如下:



传输对象:

UserInfo:

Java代码   收藏代码
  1. package Mina.Object;  
  2.   
  3. public class UserInfo implements java.io.Serializable{  
  4.     private String name;  
  5.     private String QQNum;  
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.     public String getQQNum() {  
  13.         return QQNum;  
  14.     }  
  15.     public void setQQNum(String qQNum) {  
  16.         QQNum = qQNum;  
  17.     }  
  18. }  


客户端代码:

Java代码   收藏代码
  1. package Mina.client;  
  2.   
  3. import org.apache.mina.core.service.IoHandlerAdapter;  
  4. import org.apache.mina.core.session.IoSession;  
  5.   
  6. import Mina.Object.UserInfo;  
  7.   
  8. public class ClientHandler extends IoHandlerAdapter {  
  9.     private static ClientHandler samplMinaClientHandler = null;  
  10.     public static ClientHandler getInstances() {  
  11.         if (null == samplMinaClientHandler) {  
  12.             samplMinaClientHandler = new ClientHandler();  
  13.         }  
  14.         return samplMinaClientHandler;  
  15.     }  
  16.   
  17.     private ClientHandler() {  
  18.   
  19.     }  
  20.   
  21.     public void sessionOpened(IoSession session) throws Exception {  
  22.         session.write("客户端与服务器的会话打开了……");  
  23.         UserInfo text=new UserInfo();  
  24.         text.setName("梅竹寒香");  
  25.         text.setQQNum("972341215");  
  26.         session.write(text);  
  27.     }  
  28.   
  29.     public void sessionClosed(IoSession session) {  
  30.     }  
  31.   
  32.     public void messageReceived(IoSession session, Object message)  
  33.             throws Exception {  
  34.     }  
  35.   
  36.     public void messageSent(IoSession arg0, Object arg1) throws Exception {  
  37.         System.out.println("客户端已经向服务器发送了:"+(String)arg1);  
  38.     }  
  39. }  


MainClient:

Java代码   收藏代码
  1. package Mina.client;  
  2.   
  3. import java.net.InetSocketAddress;  
  4.   
  5. import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;  
  6. import org.apache.mina.core.future.ConnectFuture;  
  7. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  8. import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;  
  9. import org.apache.mina.transport.socket.nio.NioSocketConnector;  
  10.   
  11. public class MainClient {  
  12.     private static MainClient mainClient = null;  
  13.     NioSocketConnector connector = new NioSocketConnector();  
  14.     DefaultIoFilterChainBuilder chain = connector.getFilterChain();  
  15.   
  16.     public static MainClient getInstances() {  
  17.         if (null == mainClient) {  
  18.             mainClient = new MainClient();  
  19.         }  
  20.         return mainClient;  
  21.     }  
  22.   
  23.     private MainClient() {  
  24.         chain.addLast("myChin"new ProtocolCodecFilter(  
  25.                 new ObjectSerializationCodecFactory()));  
  26.         connector.setHandler(ClientHandler.getInstances());  
  27.         connector.setConnectTimeout(30);  
  28.         ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",  
  29.                 8888));  
  30.     }  
  31.   
  32.     public static void main(String args[]) {  
  33.         MainClient.getInstances();  
  34.     }  
  35. }  


服务器端:

ServerHandler:

Java代码   收藏代码
  1. package Mina.server;  
  2.   
  3. import org.apache.mina.core.filterchain.IoFilterAdapter;  
  4. import org.apache.mina.core.service.IoHandler;  
  5. import org.apache.mina.core.session.IdleStatus;  
  6. import org.apache.mina.core.session.IoSession;  
  7.   
  8. import Mina.Object.UserInfo;  
  9.   
  10. public class ServerHandler extends IoFilterAdapter implements IoHandler {  
  11.     private static ServerHandler samplMinaServerHandler = null;  
  12.   
  13.     public static ServerHandler getInstances() {  
  14.         if (null == samplMinaServerHandler) {  
  15.             samplMinaServerHandler = new ServerHandler();  
  16.         }  
  17.         return samplMinaServerHandler;  
  18.     }  
  19.   
  20.     private ServerHandler() {  
  21.   
  22.     }  
  23.   
  24.     // 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发  
  25.     public void sessionOpened(IoSession session) throws Exception {  
  26.     }  
  27.     public void sessionClosed(IoSession session) {  
  28.     }  
  29.     public void messageReceived(IoSession session, Object message)  
  30.             throws Exception {      
  31.         if (message instanceof UserInfo) {  
  32.             UserInfo text = (UserInfo) message;  
  33.             System.out.println("服务器接收到从客户端的姓名:"+text.getName());  
  34.             System.out.println("服务器接收到从客户端的QQ:"+text.getQQNum());  
  35.         }   
  36.     }  
  37.   
  38.     public void exceptionCaught(IoSession arg0, Throwable arg1)  
  39.             throws Exception {  
  40.   
  41.     }  
  42.   
  43.     // 当消息传送到客户端后触发  
  44.     public void messageSent(IoSession arg0, Object arg1) throws Exception {  
  45.           
  46.     }  
  47.   
  48.     // 当一个新客户端连接后触发此方法.  
  49.     public void sessionCreated(IoSession arg0) throws Exception {  
  50.           
  51.     }  
  52.   
  53.     // 当连接空闲时触发此方法.  
  54.     public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception {  
  55.           
  56.     }  
  57.   
  58. }  


MainServer:

Java代码   收藏代码
  1. package Mina.server;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.InetSocketAddress;  
  5.   
  6. import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;  
  7. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  8. import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;  
  9. import org.apache.mina.transport.socket.SocketAcceptor;  
  10. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  11.   
  12. public class MainServer {  
  13.     private static MainServer mainServer = null;  
  14.     private SocketAcceptor acceptor = new NioSocketAcceptor();  
  15.     private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();  
  16.     private int bindPort = 8888;  
  17.   
  18.     public static MainServer getInstances() {  
  19.         if (null == mainServer) {  
  20.             mainServer = new MainServer();  
  21.         }  
  22.         return mainServer;  
  23.     }  
  24.   
  25.     private MainServer() {  
  26.         chain.addLast("myChin"new ProtocolCodecFilter(  
  27.                 new ObjectSerializationCodecFactory()));  
  28.         acceptor.setHandler(ServerHandler.getInstances());  
  29.         try {  
  30.             acceptor.bind(new InetSocketAddress(bindPort));  
  31.         } catch (IOException e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.     }  
  35.   
  36.     public static void main(String[] args) throws Exception {  
  37.         MainServer.getInstances();  
  38.     }  

猜你喜欢

转载自zqs520.iteye.com/blog/2211234
今日推荐