Apache Mina使用

版權聲明:原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://java999.blog.51cto.com/259217/148287
<>
Apache Mina入門MINA 基本類的描述
IoAccepter 相當於網絡應用程序中的服務器端
IoConnector 相當於客戶端
IoSession 當前客戶端到服務器端的一個連接實例
IoHandler 業務處理邏輯
IoFilter 過濾器用於懸接通訊層接口與業務層接口
 
服務器端:MinaServer.java 
public class MinaServer { 
             private static final int SERVER_PORT = 9990; 
    
             public static void main(String[] args) throws Throwable{ 
                            //服務端入口 
                            IoAcceptor acceptor = new SocketAcceptor(); 
                            SocketAcceptorConfig cfg = new SocketAcceptorConfig(); 
                            cfg.setReuseAddress(true); 
                            //設定這個過濾器將以對象爲單位讀取數據 
                            cfg.getFilterChain().addLast("codec"
new ProtocolCodecFilter(new ObjectSerializationCodecFactory())); 
                            //添加日誌過濾器 
                            cfg.getFilterChain().addLast("logger"new LoggingFilter()); 
                            //接收訪問的連接和到IoHandler觸發事件 
             acceptor.bind(new InetSocketAddress(SERVER_PORT),new ServerHandler(), cfg); 
                            System.out.println("The server Listening on port " + SERVER_PORT); 
             } 
}    
     
服務器端業務處理類: 
public class ServerHandler extends IoHandlerAdapter 

             /** 
                * 有新連接時觸發 
                */
 
             public void sessionOpened(IoSession session) { 
                            System.out.println("sessionOpened"); 
             } 
             /** 
                * 收到來自客戶端的消息 
                */
 
             public void messageReceived(IoSession session, Object message) { 
                            System.out.println("server messageReceived!"); 
                            CityMessage cm = (CityMessage)message; 
                            System.out.println(cm.getCode()+":"+cm.getName()); 
                            //將消息發向客戶端 
                            session.write(cm); 
             } 
             /** 
                * 當有異常發生時觸發 
                */
 
             public void exceptionCaught(IoSession session, Throwable cause) { 
                            session.close(); 
             } 
             /** 
                * 連接被關閉時觸發 
                */
 
             public void sessionClosed(IoSession ssn) throws Exception { 
                            System.out.println("session closed from " + ssn.getRemoteAddress()); 
             } 
}    
     
要發送的消息對象: 
public class CityMessage implements Serializable{ 
             private int code; 
             private String name; 
             public int getCode() { 
                            return code; 
             } 
             public void setCode(int code) { 
                            this.code = code; 
             } 
             public String getName() { 
                            return name; 
             } 
             public void setName(String name) { 
                            this.name = name; 
             } 
}    
     
客戶端: 
public class MinaClient { 
             private static final String HOSTNAME = "localhost";         
        private static final int PORT = 9990;         
    
        public static void main( String[] args ) throws Throwable{         
                //Connector爲客戶端入口 
                     SocketConnector connector = new SocketConnector();                         
                SocketConnectorConfig cfg = new SocketConnectorConfig();         
                //設定這個過濾器將以對象爲單位讀取數據 
                cfg.getFilterChain().addLast("codec",    
                                                                                                                        new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );         
                //添加日誌過濾器 
                cfg.getFilterChain().addLast( "logger"new LoggingFilter() );         
                //向遠程服務器發起連接,觸發事件到IoHandler    
                connector.connect(new InetSocketAddress( HOSTNAME, PORT ),         
                                                new ClientHandler(), cfg );         
        }         
}    
     
客戶端業務處理類: 
public class ClientHandler extends IoHandlerAdapter { 
             public ClientHandler() { 
                            super(); 
             } 
             /** 
                * 有新連接時觸發 
                */
 
             public void sessionOpened(IoSession session) { 
                            // 創建一個cityMessage發送 
                            CityMessage cm = new CityMessage(); 
                            cm.setCode(547600); 
                            cm.setName("鳳山"); 
                            session.write(cm); 
             } 
             /** 
                * 收到來自客戶端的消息 
                */
 
             public void messageReceived(IoSession session, Object message) { 
                            System.out.println("client messageReceived!"); 
                            CityMessage cm = (CityMessage)message; 
                            System.out.println(cm.getCode()+":"+cm.getName()); 
             } 
             /** 
                * 當有異常發生時觸發 
                */
 
             public void exceptionCaught(IoSession session, Throwable cause) { 
                            session.close(); 
             } 
             /** 
                * 連接被關閉時觸發 
                */
 
             public void sessionClosed(IoSession ssn) throws Exception { 
                            System.out.println("session closed from " + ssn.getRemoteAddress()); 
             } 
}    
開發一個Mina應用,簡單的說,就是創建連結,設定過濾規則,編寫自己的消息處理器這三步!
 
過濾器:
ObjectSerializationCodecFactory:設定這個過濾器將以對象爲單位讀取數據。
TextLineCodecFactory:設定這個過濾器將一行一行(/r/n)的讀取數據
 
注意:(摘抄自網上) apache mina建立的socket不管是採用TCP或是UDP,在Filter不添加codec選項的情況下,由IoHandlerAdapter派生的處理handler 類中public void messageReceived(IoSession session, Object message){}函數裏的message對象是IoBuffer的實例,如下:
@Override 
        public void messageReceived(IoSession session, Object message) 
                        throws Exception { 

                if (! (message instanceof IoBuffer)) { 
                            return
                     } 

                IoBuffer rb = (IoBuffer) message; 
                callback.messageReceived(java.nio.ByteBuffer.wrap(rb.array(), 0, rb.buf().limit())); 
        }



如果你使用mina建立一個socket添加了如下:
IoFilter CODEC_FILTER = new ProtocolCodecFilter(
                new TextLineCodecFactory());
connector(acceptor).getFilterChain().addLast("codec", CODEC_FILTER);
如果發送數據的socket不是同樣的設置或者不是利用mina建立的socket則發送數據的時候需要在數據末尾添加‘/n’,以表示字符串結束。
 

本文出自 “青山” 博客,請務必保留此出處http://java999.blog.51cto.com/259217/148287

發佈了171 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章