hengheng123456789

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
           

          Apache MINA 快速入門

           

          http://hi.baidu.com/ofbase/blog/item/9acf45d05989f88ea1ec9c11.html

          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

          這個程序只測試了Windows2000proLinux系統,并且在做的時候沒有依賴于一些開發平臺的環境。

          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 );
              }
          }

          這里用于管理信息,覆蓋了exceptionCaughtmessageReceivedsessionCreated方法,如前所示,該類擴展了IoHandlerAdapter

          exceptionCaught方法將會打印錯誤并且關閉對話,對于大多數的情況來講,這是標準的處理方法,除非能從異常中恢復過來。

          messageReceived方法將收到從客戶端發來的數據,并且寫回當前時間。如果收到了"quit",對話將被關閉。該方法將當前時間發往客戶端,依賴于你使用的協議編碼,發送至方法的對象(第二個參數)會有不同,發送到session.write(Object)方法的對象類同。如果你沒有指定協議編碼,則一般會收到ByteBuffer對象,而發送的也要是ByteBuffer對象。

          sessionCreated方法用于對話初始化,在這里,先打印一條信息,然后判斷對話的類型,再設置緩沖大小,這里設置的是2048個字節??臻e時間設置為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...

          4 參考文檔

              Apache MINA Quick Start Guide http://mina.apache.org/documentation.html

                Added by Mark Webb, last edited by Trustin Lee on Apr 16, 2007    (view change)

          posted on 2007-09-03 15:38 哼哼 閱讀(1285) 評論(0)  編輯  收藏 所屬分類: JAVA-Web
          主站蜘蛛池模板: 修文县| 河南省| 中西区| 康定县| 东辽县| 老河口市| 应城市| 车致| 麻城市| 台中市| 霸州市| 巴南区| 楚雄市| 渭源县| 鄯善县| 江华| 江源县| 朔州市| 东海县| 泽州县| 西丰县| 神池县| 桃园县| 濮阳县| 湖北省| 宁波市| 庆安县| 岗巴县| 临沭县| 青浦区| 达州市| 木兰县| 封开县| 海淀区| 肥东县| 南江县| 绥阳县| 阿克陶县| 海安县| 泰和县| 鄂州市|