亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Apache Mina通信框架架構與應用

2019-11-10 18:00:11
字體:
來源:轉載
供稿:網友

Apache Mina Server 是一個網絡通信應用框架,也就是說,它主要是對基于 TCP/ip、UDP/IP協議棧的通信框架(當然,也可以提供 java 對象的序列化服務、虛擬機管道通信服務等),Mina 可以幫助我們快速開發高性能、高擴展性的網絡通信應用,Mina 提供了事件驅動、異步(Mina 的異步 IO 默認使用的是 JAVA NIO 作為底層支持)操作的編程模型。從官網文檔“MINA based application Architecture”中可以看到Mina作為一個通信層框架,在實際應用所處的位置,如圖所示:apparch_smallMina位于用戶應用程序和底層Java網絡API(和in-VM通信)之間,我們開發基于Mina的網絡應用程序,就無需關心復雜的通信細節。

應用整體架構

再看一下,Mina提供的基本組件,如圖所示:mina_app_arch也就是說,無論是客戶端還是服務端,使用Mina框架實現通信的邏輯分層在概念上統一的,即包含如下三層:

I/O Service – Performs actual I/OI/O Filter Chain – Filters/Transforms bytes into desired Data Structures and vice-versaI/O Handler – Here resides the actual business logic

想要開發基于MIna的應用程序,你只需要做如下事情:

Create an I/O service – Choose from already available Services (*Acceptor) or create your ownCreate a Filter Chain – Choose from already existing Filters or create a custom Filter for transforming request/responseCreate an I/O Handler – Write business logic, on handling different messages

下面看一下使用Mina的應用程序,在服務器端和客戶端的架構細節:

服務器端架構服務器端監聽指定端口上到來的請求,對這些請求經過處理后,回復響應。它也會創建并處理一個鏈接過來的客戶會話對象(session)。服務器端架構如圖所示:Server_arch對服務器端的說明,引用官網文檔,如下所示:

IOAcceptor listens on the network for incoming connections/packetsFor a new connection, a new session is created and all subsequent request from IP Address/Port combination are handled in that SessionAll packets received for a Session, traverses the Filter Chain as specified in the diagram. Filters can be used to modify the content of packets (like converting to Objects, adding/removing information etc). For converting to/from raw bytes to High Level Objects, PacketEncoder/Decoder are particularly usefulFinally the packet or converted object lands in IOHandler. IOHandlers can be used to fulfill business needs.

客戶端架構客戶端主要做了如下工作:

連接到服務器端向服務器發送消息等待服務器端響應,并處理響應

客戶端架構,如圖所示:clientdiagram對客戶端架構的說明,引用官網文檔內容,如下所示:

Client first creates an IOConnector (MINA Construct for connecting to Socket), initiates a bind with ServerUpon Connection creation, a Session is created and is associated with ConnectionApplication/Client writes to the Session, resulting in data being sent to Server, after traversing the Filter ChainAll the responses/messages received from Server are traverses the Filter Chain and lands at IOHandler, for PRocessing

應用實例開發

下面根據上面給出的架構設計描述,看一下Mina(版本2.0.7)自帶的例子,如何實現一個簡單的C/S通信的程序,非常容易。服務端首先,服務器端需要使用的組件有IoAdaptor、IoHandler、IoFilter,其中IoFilter可選.我們基于Mina自帶的例子進行了簡單地修改,實現服務端IoHandler的代碼如下所示:

01package org.shirdrn.mina.server;
02 
03import org.apache.mina.core.service.IoHandlerAdapter;
04import org.apache.mina.core.session.IdleStatus;
05import org.apache.mina.core.session.IoSession;
06import org.slf4j.Logger;
07import org.slf4j.LoggerFactory;
08 
09public class TinyServerProtocolHandler extends IoHandlerAdapter {
10    private final static Logger LOGGER = LoggerFactory.getLogger(TinyServerProtocolHandler.class);
11    
12    @Override
13    public void sessionCreated(IoSession session) {
14        session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
15    }
16 
17    @Override
18    public void sessionClosed(IoSession session) throws Exception {
19        LOGGER.info("CLOSED");
20    }
21 
22    @Override
23    public void sessionOpened(IoSession session) throws Exception {
24        LOGGER.info("OPENED");
25    }
26 
27    @Override
28    public void sessionIdle(IoSession session, IdleStatus status) {
29        LOGGER.info("*** IDLE #" + session.getIdleCount(IdleStatus.BOTH_IDLE) + " ***");
30    }
31 
32    @Override
33    public void exceptionCaught(IoSession session, Throwable cause) {
34        session.close(true);
35    }
36 
37    @Override
38    public void messageReceived(IoSession session, Object message)
39            throws Exception {
40        LOGGER.info( "Received : " + message );
41       if(!session.isConnected()) {
42            session.close(true);
43       }
44    }
45}

這個版本中,IoHandlerAdapter實現了IoHandler接口,里面封裝了一組用于事件處理的空方法,其中包含服務端和客戶端的事件。在實際應用中,客戶端可以選擇客戶端具有的事件,服務器端選擇服務器端具有的事件,然后分別對這兩類事件進行處理(有重疊的事件,如連接事件、關閉事件、異常事件等)。客戶端的IoHandler的具體實現也是類似的,不過多累述。下面看啟動服務器的主方法類,代碼如下所示:

01package org.shirdrn.mina.server;
02 
03import java.net.InetSocketAddress;
04 
05import org.apache.mina.filter.codec.ProtocolCodecFilter;
06import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
07import org.apache.mina.transport.socket.SocketAcceptor;
08import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
09import org.slf4j.Logger;
10import org.slf4j.LoggerFactory;
11 
12public class TinyMinaServer {
13 
14    private final static Logger LOG = LoggerFactory.getLogger(TinyMinaServer.class);
15    /** Choose your favorite port number. */
16    private static final int PORT = 8080;
17 
18    public static void main(String[] args) throws Exception {
19        SocketAcceptor acceptor = new NioSocketAcceptor();
20        acceptor.setReuseAddress(true);
21        acceptor.getFilterChain().addLast("codec"new ProtocolCodecFilter(newTextLineCodecFactory()));
22 
23        // Bind
24        acceptor.setHandler(new TinyServerProtocolHandler());
25        acceptor.bind(new InetSocketAddress(PORT));
26        LOG.info("Listening on port " + PORT);
27 
28        LOG.info("Server started!");
29 
30        for (;;) {
31            LOG.info("R: " + acceptor.getStatistics().getReadBytesThroughput() + ", W: " + acceptor.getStatistics().getWrittenBytesThroughput());
32            Thread.sleep(3000);
33        }
34    }
35 
36}

客戶端實現客戶端IoHandler的代碼如下所示:

01package org.shirdrn.mina.client;
02 
03import org.apache.mina.core.service.IoHandlerAdapter;
04import org.apache.mina.core.session.IdleStatus;
05import org.apache.mina.core.session.IoSession;
06import org.slf4j.Logger;
07import org.slf4j.LoggerFactory;
08 
09public class TinyClientProtocolHandler extends IoHandlerAdapter {
10 
11    private final static Logger LOGGER = LoggerFactory
12            .getLogger(TinyClientProtocolHandler.class);
13 
14    @Override
15    public void sessionCreated(IoSession session) {
16        LOGGER.info("CLIENT::CREATED");
17    }
18 
19    @Override
20    public void sessionClosed(IoSession session) throws Exception {
21        LOGGER.info("CLIENT::CLOSED");
22    }
23 
24    @Override
25    public void sessionOpened(IoSession session) throws Exception {
26        LOGGER.info("CLIENT::OPENED");
27    }
28 
29    @Override
30    public void sessionIdle(IoSession session, IdleStatus status) {
31        LOGGER.info("CLIENT::*** IDLE #"
32                + session.getIdleCount(IdleStatus.BOTH_IDLE) + " ***");
33    }
34 
35    @Override
36    public void exceptionCaught(IoSession session, Throwable cause) {
37        LOGGER.info("CLIENT::EXCEPTIONCAUGHT");
38        cause.printStackTrace();
39    }
40 
41    public void messageSent(IoSession session, Object message) throws Exception {
42        LOGGER.info("CLIENT::MESSAGESENT: " + message);
43    }
44}

下面看啟動客戶端的主方法類,代碼如下所示:

01package org.shirdrn.mina.client;
02 
03import java.net.InetSocketAddress;
04 
05import org.apache.mina.core.future.ConnectFuture;
06import org.apache.mina.filter.codec.ProtocolCodecFilter;
07import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
08import org.apache.mina.transport.socket.SocketConnector;
09import org.apache.mina.transport.socket.nio.NioSocketConnector;
10import org.slf4j.Logger;
11import org.slf4j.LoggerFactory;
12 
13public class TinyMinaClient {
14 
15    private final static Logger LOG = LoggerFactory.getLogger(TinyMinaClient.class);
16    /** Choose your favorite port number. */
17    private static final int PORT = 8080;
18 
19    public static void main(String[] args) throws Exception {
20        SocketConnector connector = new NioSocketConnector();
21 
22        // Connect
23        connector.getFilterChain().addLast("codec"new ProtocolCodecFilter(newTextLineCodecFactory()));
24        connector.setHandler(new TinyClientProtocolHandler());
25 
26        for (int i = 0; i < 10; i++) {
27            ConnectFuture future = connector.connect(new InetSocketAddress(PORT));
28            LOG.info("Connect to port " + PORT);
29            future.awaitUninterruptibly();
30            future.getSession().write(String.valueOf(i));
31            Thread.sleep(1500);
32        }
33 
34    }
35}

我們只是發送了十個數字,每發一次間隔1500ms。測試上述服務器端與客戶端交互,首先啟動服務器端,監聽8080端口。接著啟動客戶端,連接到服務器端8080端口,然后發送消息,服務器端接收到消息后,直接將到客戶端的連接關閉掉。


上一篇:MFC指示燈學習

下一篇:字符串擴展

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美老肥婆性猛交视频| 欧美日韩ab片| 97婷婷涩涩精品一区| 久久久久www| 日韩精品一区二区三区第95| 久久九九精品99国产精品| 裸体女人亚洲精品一区| 国产精品高潮呻吟久久av黑人| 国产999在线| 国产日韩一区在线| 午夜精品久久17c| 精品福利樱桃av导航| 欧美裸体xxxx极品少妇软件| 日本韩国在线不卡| 色av中文字幕一区| 久久香蕉精品香蕉| 91成人国产在线观看| 欧美成人精品不卡视频在线观看| 亚洲欧美中文字幕在线一区| www.久久草.com| 成人天堂噜噜噜| 国产成人精品久久二区二区91| 国产日韩欧美黄色| www.亚洲男人天堂| 日韩av毛片网| 国产ts一区二区| 神马国产精品影院av| 视频在线观看一区二区| 午夜精品一区二区三区在线视| 在线日韩中文字幕| 性欧美亚洲xxxx乳在线观看| 69av成年福利视频| 国产精品电影一区| 日韩在线视频播放| 欧美日韩一区二区三区在线免费观看| 91网站在线免费观看| 欧美日韩高清区| 色老头一区二区三区在线观看| 亚洲第一av在线| 国产精品久久久久aaaa九色| 亚洲一级黄色av| 欧美色图在线视频| 国产经典一区二区| 成人黄色免费在线观看| 亚洲精品不卡在线| 欧美色道久久88综合亚洲精品| 国产91精品久久久久久久| 都市激情亚洲色图| 麻豆国产精品va在线观看不卡| 欧美性生交大片免网| 国产一区二区三区在线播放免费观看| 久久国产色av| 国产精品扒开腿做爽爽爽男男| 久久久人成影片一区二区三区观看| 96sao精品视频在线观看| 亚洲天堂av综合网| 欧美孕妇毛茸茸xxxx| 日韩国产欧美精品一区二区三区| 免费成人高清视频| 亚洲人成亚洲人成在线观看| 亚洲国产免费av| 亚洲国产成人精品一区二区| 午夜精品理论片| 亚洲人成在线一二| 亚洲乱码一区av黑人高潮| 一区二区三区无码高清视频| 日韩欧美在线视频免费观看| 久久久精品国产| 久久久久久久久久av| 亚洲国产日韩一区| 欧美激情xxxx性bbbb| 国产精品日韩在线| 日韩中文在线观看| 亚洲视频在线观看视频| 国内精品久久影院| 久久亚洲电影天堂| 国产精品高清免费在线观看| 精品少妇一区二区30p| 国产热re99久久6国产精品| 欧美疯狂xxxx大交乱88av| 在线国产精品视频| 欧美在线视频在线播放完整版免费观看| 精品国偷自产在线视频| 77777少妇光屁股久久一区| 福利视频第一区| 亚洲欧美日本精品| 高清欧美性猛交xxxx黑人猛交| 亚洲电影在线看| 久久99精品久久久久久琪琪| 77777亚洲午夜久久多人| 日韩美女在线观看一区| 亚洲一区亚洲二区| 久久久99免费视频| www欧美xxxx| 国产v综合v亚洲欧美久久| 亚洲国产精彩中文乱码av在线播放| 欧美精品在线免费| 色偷偷噜噜噜亚洲男人| 57pao成人国产永久免费| 菠萝蜜影院一区二区免费| 亚洲国产91色在线| 亚洲视频在线观看视频| 精品日本美女福利在线观看| 亚洲视频电影图片偷拍一区| 欧美午夜激情小视频| 国产精品揄拍一区二区| 亚洲欧美色图片| 精品久久久久久久中文字幕| 九九热精品视频| 久久成人亚洲精品| 亚洲a成v人在线观看| 日韩精品丝袜在线| 色偷偷av一区二区三区乱| 成人久久久久爱| 51色欧美片视频在线观看| 在线观看日韩专区| 国产不卡精品视男人的天堂| 欧美在线影院在线视频| 一区二区三区四区精品| 国产精品美女久久久久av超清| 国产丝袜一区二区| 97香蕉超级碰碰久久免费软件| 7m精品福利视频导航| 亚洲bt欧美bt日本bt| 91干在线观看| 国产视频精品在线| 777午夜精品福利在线观看| 91免费看片在线| 亚洲精品wwwww| 国产欧美一区二区三区在线看| 久久精品99久久久久久久久| 国模私拍视频一区| 亚洲精品短视频| 欧美亚洲激情视频| 亚洲综合在线中文字幕| 国产精品美女久久| 亚洲成人中文字幕| 亚洲精品97久久| 在线成人中文字幕| 亚洲精品乱码久久久久久按摩观| 亚洲mm色国产网站| 欧美极品在线播放| 欧美日韩中文在线观看| 欧美激情va永久在线播放| 日韩成人在线观看| 2019亚洲男人天堂| 欧美激情一区二区三区成人| 日韩人在线观看| 亚洲人成在线免费观看| 亚洲精品福利视频| 欧美成人亚洲成人日韩成人| 国产精品女主播| 69视频在线免费观看| 亚洲成色999久久网站| 96精品久久久久中文字幕| 久久青草福利网站| 国产婷婷色综合av蜜臀av| 久久精品国产69国产精品亚洲| 欧美黑人一区二区三区| 日韩精品视频三区| 精品一区精品二区| 欧美成人黑人xx视频免费观看| 91九色综合久久| 国产精品久久久久久久一区探花|