Java Mina-2.0.16框架學(xué)習(xí)使用

本文使用mina-2.0.16.jar

Apache Mina Server 是一個網(wǎng)絡(luò)通信應(yīng)用框架,也就是說钢坦,它主要是對基于TCP/IP倔监、UDP/IP協(xié)議棧的通信框架(當(dāng)然戒幔,也可以提供JAVA 對象的序列化服務(wù)访递、虛擬機(jī)管道通信服務(wù)等)粒梦,Mina 可以幫助我們快速開發(fā)高性能亮航、高擴(kuò)展性的網(wǎng)絡(luò)通信應(yīng)用,Mina 提供了事件驅(qū)動匀们、異步(Mina 的異步IO 默認(rèn)使用的是JAVA NIO 作為底層支持)操作的編程模型缴淋。
Mina 同時提供了網(wǎng)絡(luò)通信的Server 端、Client 端的封裝泄朴,無論是哪端重抖,Mina 在整個網(wǎng)通通信結(jié)構(gòu)中都處于如下的位置:可見Mina 的API 將真正的網(wǎng)絡(luò)通信與我們的應(yīng)用程序隔離開來,你只需要關(guān)心你要發(fā)送祖灰、接收的數(shù)據(jù)以及你的業(yè)務(wù)邏輯即可钟沛。同樣的,無論是哪端局扶,Mina 的執(zhí)行流程如下所示:
(1) IoService:這個接口在一個線程上負(fù)責(zé)套接字的建立恨统,擁有自己的Selector,監(jiān)聽是否有連接被建立三妈。
(2) IoProcessor:這個接口在另一個線程上畜埋,負(fù)責(zé)檢查是否有數(shù)據(jù)在通道上讀寫,也就是說它也擁有自己的Selector畴蒲,這是與我們使用Java NIO 編碼時的一個不同之處由捎,通常在JavaNIO 編碼中,我們都是使用一個Selector饿凛,也就是不區(qū)分IoService與IoProcessor 兩個功能接口狞玛。另外,IoProcessor 負(fù)責(zé)調(diào)用注冊在IoService 上的過濾器涧窒,并在過濾器鏈之后調(diào)用IoHandler心肪。
(3) IoFilter:這個接口定義一組攔截器,這些攔截器可以包括日志輸出纠吴、黑名單過濾硬鞍、數(shù)據(jù)的編碼(write 方向)與解碼(read 方向)等功能,其中數(shù)據(jù)的encode 與decode是最為重要的戴已、也是你在使用Mina 時最主要關(guān)注的地方固该。
(4) IoHandler:這個接口負(fù)責(zé)編寫業(yè)務(wù)邏輯,也就是接收糖儡、發(fā)送數(shù)據(jù)的地方伐坏。

  1. 服務(wù)器端

/**
 * mina服務(wù)器端
 * @author mazaiting
 */
public class MinaServer {
    /**
     * 監(jiān)聽的端口
     */
    private static final int PORT = 9123;
    
    public static void start() throws IOException{
        // 1. 創(chuàng)建IoAcceptor
        IoAcceptor acceptor = new NioSocketAcceptor();
        // 2. 加入日志記錄過濾器,用SL4J庫記錄信息
        acceptor.getFilterChain().addLast("logger", new LoggingFilter());
        // 3. 加入編碼過濾器握联,用于解碼所有收到的信息,使用 new TextLineCodecFactory() r
        // 發(fā)送的信息進(jìn)行編碼桦沉,返回是MINA自帶的,功能有限金闽,只能處理文本戒者String類型纯露。
        acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(
                new TextLineCodecFactory(Charset.forName("UTF-8"))));
        // 4. 設(shè)置ServerHandler, 自定義的Handler,TimeServerHandler
        acceptor.setHandler(new TimerServerHandler());
        // 5. 設(shè)置Session的對應(yīng)I/O processor讀緩存區(qū)大小2048,通常這個參數(shù)不需要設(shè)置
        acceptor.getSessionConfig().setReadBufferSize(2048);
        // 6. 設(shè)置空閑時間代芜, 這里的BOTH_IDLE指EADER_IDLE和WRITER_IDLE都為10秒
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
        // 7. 綁定監(jiān)聽端口9123.
//      acceptor.bind(new InetSocketAddress("localhost",PORT));
        acceptor.bind(new InetSocketAddress(PORT)); 
    }
    
    public static void main(String[] args) throws IOException {
        start();
    }
    
    /**
     * 服務(wù)器端消息處理器
     * @author mazaiting
     */
    public static class TimerServerHandler extends IoHandlerAdapter{
        @Override
        public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
            /**
             * 自定義異常處理埠褪, 要不然異常會被“吃掉”;
             */
            cause.printStackTrace();
        }
        @Override
        public void messageReceived(IoSession session, Object message) throws Exception {
            /**
             * 對接收到的消息(已經(jīng)解碼)迕行下一步處理挤庇,這里對收到的字符串進(jìn)行判斷钞速,
             * 如果是”quit”則斷開連接;否則輸出當(dāng)前時間的字符串格式罚随;
             */
            String str = message.toString();
            if (str.trim().equalsIgnoreCase("quit")) {
                session.closeNow();
                return;
            }
            Date date = new Date();
            session.write(date.toString());
            System.out.println("Message written...");
        }
        @Override
        public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
            /**
             * 當(dāng)Session處于IDLE狀態(tài)的時候玉工,輸出空閑狀態(tài)次數(shù);
             */
            System.out.println("IDLE:" + session.getIdleCount(status));
        }
    }
    
}

運(yùn)行代碼淘菩,在cmd(命令提示符) 中輸入"telnet 127.0.0.1 9123"遵班,連接成功后隨意輸入字符,并按下回車潮改,即可看到當(dāng)前時間狭郑。

  1. 客戶端

/**
 * mina客戶端
 * @author mazaiting
 */
public class MinaClient {

    /**
     * 監(jiān)聽的端口
     */
    private static final int PORT = 9123;
    
    public static void start() {
        IoConnector connector = new NioSocketConnector();
        connector.setConnectTimeoutMillis(30000);
        connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(
                new TextLineCodecFactory(Charset.forName("UTF-8"), 
                LineDelimiter.WINDOWS.getValue(),
                LineDelimiter.WINDOWS.getValue())));
        connector.setHandler(new ClientHandler("你好!\r\n 大家好汇在!"));
        connector.connect(new InetSocketAddress("localhost", 9123));        
    }
    
    public static void main(String[] args) {
        start();
    }
    
    
    private static class ClientHandler extends IoHandlerAdapter{
        private String values;
        public ClientHandler(String values) {
            this.values = values;
        }
        @Override
        public void sessionOpened(IoSession session) throws Exception {
            session.write(values);
        }
        @Override
        public void messageReceived(IoSession session, Object message) throws Exception {
            System.out.println(message.toString());
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翰萨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子糕殉,更是在濱河造成了極大的恐慌亩鬼,老刑警劉巖殖告,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雳锋,居然都是意外死亡黄绩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門玷过,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爽丹,“玉大人,你說我怎么就攤上這事辛蚊≡列” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵袋马,是天一觀的道長初澎。 經(jīng)常有香客問我,道長飞蛹,這世上最難降的妖魔是什么谤狡? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮卧檐,結(jié)果婚禮上墓懂,老公的妹妹穿的比我還像新娘。我一直安慰自己霉囚,他們只是感情好捕仔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盈罐,像睡著了一般榜跌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盅粪,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天钓葫,我揣著相機(jī)與錄音,去河邊找鬼票顾。 笑死础浮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奠骄。 我是一名探鬼主播豆同,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼含鳞!你這毒婦竟也來了影锈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸭廷,沒想到半個月后枣抱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靴姿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年沃但,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佛吓。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖垂攘,靈堂內(nèi)的尸體忽然破棺而出维雇,到底是詐尸還是另有隱情,我是刑警寧澤晒他,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布吱型,位于F島的核電站,受9級特大地震影響陨仅,放射性物質(zhì)發(fā)生泄漏津滞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一灼伤、第九天 我趴在偏房一處隱蔽的房頂上張望触徐。 院中可真熱鬧,春花似錦狐赡、人聲如沸撞鹉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸟雏。三九已至,卻和暖如春览祖,著一層夾襖步出監(jiān)牢的瞬間孝鹊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工展蒂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留又活,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓玄货,卻偏偏與公主長得像皇钞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子松捉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容