Apache MINA 入门教程

fengjifei 贡献于2012-05-08

作者 微软用户  创建于2010-10-26 05:39:00   修改者微软用户  修改于2010-10-26 05:40:00字数3758

文档摘要:题记:因为开发需要用到Apache MINA框架,所以看了一下其文档,顺手译了一部分,下面内容没有测试,只是译了出来,后面测试一下,如果有问题再提出来。
关键词:

 题记: 因为开发需要用到Apache MINA框架,所以看了一下其文档,顺手译了一部分,下面内容没有测试,只是译了出来,后面测试一下,如果有问题再提出来。 Apache MINA 快速入门 Added by Mark Webb, last edited by Trustin Lee on Apr 16, 2007    (view change) 1    简介 建立一个基于MINA的时间服务器,下面的内容需要先准备好。 MINA 1.1 Core JDK 1.5 or greater SLF4J    1.3.0 or greater >>Log4J 1.2 users: slf4j-api.jar, slf4j-log4j12.jar, and Log4J    1.2.x >>Log4J 1.3 users: slf4j-api.jar, slf4j-log4j13.jar, and Log4J    1.3.x >>java.util.logging users: slf4j-api.jar and slf4j-jdk14.jar 这个程序只测试了Windows2000pro和Linux系统,并且在做的时候没有依赖于一些开发平台的环境。 2    编写MINA时间服务 下面先建立一个文件MinaTimeServer.java,代码如下: public class MinaTimeServer {     public static void main(String[] args) {       // code will go here next     } } 下面会慢慢将这个类写完,这里先定义一个main用于启动程序。这一步结束后,还需要一个监听连接的对象,因为这个程序是基于TCP/IP的,这里将增加一个SocketAcceptor。 import org.apache.mina.common.IoAcceptor; import org.apache.mina.transport.socket.nio.SocketAcceptor; public class MinaTimeServer {     public static void main(String[] args) {       // The following two lines change the default buffer type to 'heap',       // which yields better performance.       ByteBuffer.setUseDirectBuffers(false);       ByteBuffer.setAllocator(new SimpleByteBufferAllocator());       IoAcceptor acceptor = new SocketAcceptor();     } } 通过这里的SocketAcceptor类,下面将把它绑定到一个端口上,如果你想增加一个线程模型到该类的话,参考"配置线程模型"部分。 import java.io.IOException; import java.net.InetSocketAddress; import org.apache.mina.common.IoAcceptor; import org.apache.mina.transport.socket.nio.SocketAcceptor; public class MinaTimeServer {     private static final int PORT = 9123;     public static void main(String[] args) throws IOException {       ByteBuffer.setUseDirectBuffers(false);       ByteBuffer.setAllocator(new SimpleByteBufferAllocator());       IoAcceptor acceptor = new SocketAcceptor();       SocketAcceptorConfig cfg = new SocketAcceptorConfig();       cfg.getSessionConfig().setReuseAddress( true );       cfg.getFilterChain().addLast( "logger", new LoggingFilter() );       cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter(                           new TextLineCodecFactory( Charset.forName( "UTF-8" ))));       acceptor.bind( new InetSocketAddress(PORT), new TimeServerHandler(), cfg);       System.out.println("MINA Time server started.");     } } 这里定义了一个整型的端口变量,呼叫SocketAcceptor.bind(SocketAddress,IoHandler,cfg),第一个参数是要监听的网址,是本地的9123端口。 第二个参数传的是实现IoHandler接口的类,是服务于所有的客户端请求的。在这里,将会扩展IoHandlerAdapter类,这类遵循"适配器设计模式"的。 第三个参数是配置对象,用于配置日志和编码过滤器。每一个信息都会通过在IoAcceptor中定义的过滤器链的所有过滤器。在这风景点,将会将信息通过日志和编码过滤器。日志过滤器用SL4J库记录信息,而编码过滤器则反编码所有收到的信息,并且将所有TextLineCodecFactory发送的信息进行编码。 下面就是TimeServerHandler类的代码: import java.util.Date; import org.apache.mina.common.IoHandlerAdapter; import org.apache.mina.common.IoSession; public class TimeServerHandler extends IoHandlerAdapter {     public void exceptionCaught(IoSession session, Throwable t) throws Exception {       t.printStackTrace();       session.close();     }     public void messageReceived(IoSession session, Object msg) throws Exception {       String str = msg.toString();       if( str.trim().equalsIgnoreCase("quit") ) {         session.close();         return;       }       Date date = new Date();       session.write( date.toString() );       System.out.println("Message written...");     }     public void sessionCreated(IoSession session) throws Exception {       System.out.println("Session created...");       if( session.getTransportType() == TransportType.SOCKET )         ((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 );       session.setIdleTime( IdleStatus.BOTH_IDLE, 10 );     } } 这里用于管理信息,覆盖了exceptionCaught,messageReceived和sessionCreated方法,如前所示,该类扩展了IoHandlerAdapter。 exceptionCaught方法将会打印错误并且关闭对话,对于大多数的情况来讲,这是标准的处理方法,除非能从异常中恢复过来。 messageReceived方法将收到从客户端发来的数据,并且写回当前时间。如果收到了"quit",对话将被关闭。该方法将当前时间发往客户端,依赖于你使用的协议编码,发送至方法的对象(第二个参数)会有不同,发送到session.write(Object)方法的对象类同。如果你没有指定协议编码,则一般会收到ByteBuffer对象,而发送的也要是ByteBuffer对象。 sessionCreated方法用于对话初始化,在这里,先打印一条信息,然后判断对话的类型,再设置缓冲大小,这里设置的是2048个字节。空闲时间设置为10秒,如果覆盖了sessionIdle方法,则该方法每10秒被呼叫一次。 3    测试 到这里,编译程序。如果成功,那么运行,然后telnet这个程序,如下所示: 客户端内容: user@myhost:~> telnet 127.0.0.1 9123 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. hello Mon Apr 09 23:42:55 EDT 2007 quit Connection closed by foreign host. user@myhost:~> 服务端内容: MINA Time server started. Session created... Message written...

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档