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

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

Apache Mina通信框架架構與應用

2019-11-10 17:53:33
字體:
來源:轉載
供稿:網友

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

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端口,然后發送消息,服務器端接收到消息后,直接將到客戶端的連接關閉掉。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久国产精品三级玉女聊斋| 国产不卡av在线免费观看| 日韩在线观看免费全集电视剧网站| 精品自在线视频| 91欧美精品成人综合在线观看| 97在线视频国产| 日本午夜精品理论片a级appf发布| 91伊人影院在线播放| 欧美午夜性色大片在线观看| 欧美亚洲国产成人精品| 欧美成人午夜激情| 日本伊人精品一区二区三区介绍| 欧美老少做受xxxx高潮| 91国在线精品国内播放| 日韩精品在线播放| 欧美性猛xxx| 亚洲精选在线观看| 日韩精品一二三四区| 亚洲激情中文字幕| 日韩精品视频在线观看网址| 精品久久久中文| 国产精品高清在线观看| 久久天堂电影网| 国产精品美女999| 91久久精品在线| 国产精品国产三级国产aⅴ浪潮| 国产精品大陆在线观看| 91香蕉国产在线观看| 国产成人精品久久二区二区| 久久久噜噜噜久久| 成人免费看吃奶视频网站| 亚洲精品99久久久久中文字幕| 国产精品高潮呻吟久久av黑人| 久久夜色精品国产欧美乱| 亚洲一区亚洲二区亚洲三区| 97在线看福利| 日韩一区二区欧美| 欧洲永久精品大片ww免费漫画| 91精品综合久久久久久五月天| 中文字幕久久久av一区| 中文字幕亚洲一区二区三区| 精品中文字幕在线| 欧美又大粗又爽又黄大片视频| 精品国产自在精品国产浪潮| 久久精品影视伊人网| 日韩在线免费观看视频| 伊人一区二区三区久久精品| 欧美成年人视频网站| 亚洲精品国产美女| 国产精品亚发布| 亚洲免费小视频| 亚洲男人天堂网| 色婷婷久久av| 欧美高清电影在线看| 亚州成人av在线| 91社影院在线观看| 欧美成人在线网站| 国产精品久久99久久| 精品毛片网大全| 国产不卡在线观看| 91精品视频在线免费观看| 欧美精品生活片| 亚洲精品美女网站| 欧美视频一二三| 日韩亚洲第一页| 日韩在线免费观看视频| 日韩精品视频免费在线观看| 成人综合网网址| 久久久久99精品久久久久| 久久69精品久久久久久久电影好| 中文字幕精品www乱入免费视频| 亚洲伦理中文字幕| 这里只有精品久久| 亚洲精品福利资源站| 亚洲欧美在线免费观看| 日韩精品视频中文在线观看| 亚洲一区二区三区在线视频| 欧美xxxx18性欧美| 欧美极品少妇xxxxⅹ免费视频| 国产精品久久久久久婷婷天堂| 精品久久久久久久久久久久| 日韩风俗一区 二区| 18久久久久久| 亚洲偷熟乱区亚洲香蕉av| 中文字幕成人在线| 欧美日韩国产麻豆| 亚洲欧美日韩高清| 国产盗摄xxxx视频xxx69| 中文国产成人精品| 久久国产精品偷| 欧美日韩国产精品| 精品国产成人在线| 久久视频在线播放| 亚洲欧美制服另类日韩| 国产乱肥老妇国产一区二| 亚洲国产成人久久综合一区| 亚洲欧美中文日韩在线v日本| 久久精品视频中文字幕| 亚洲精美色品网站| 91在线色戒在线| 欧美性视频网站| 欧美性在线视频| 福利一区视频在线观看| 97在线观看免费| 欧美第一页在线| 国产日韩中文在线| 亚洲精品成人免费| 亚洲人成在线观看网站高清| 精品在线观看国产| 欧美性猛交xxxxx水多| 日本中文字幕久久看| 国产日韩换脸av一区在线观看| 国产日韩欧美日韩| 国语自产精品视频在线看抢先版图片| 在线观看欧美www| 另类专区欧美制服同性| 久久av中文字幕| 92国产精品久久久久首页| 8x海外华人永久免费日韩内陆视频| 欧美成人免费全部观看天天性色| 国产精品自产拍在线观看中文| 亚洲精品一区二区在线| 美女久久久久久久久久久| 黑人与娇小精品av专区| 亚洲精品一区二三区不卡| 国产精品久久久久久久久久免费| 91香蕉亚洲精品| 国产成人高清激情视频在线观看| 亚洲欧美国内爽妇网| 美女久久久久久久| 色综合影院在线| 98午夜经典影视| 91中文字幕在线观看| 日韩在线视频网| 夜夜嗨av色一区二区不卡| 亚洲网站在线观看| 欧美精品制服第一页| 中文字幕亚洲无线码a| 亚洲欧美制服综合另类| 亚洲第一视频网站| 成人444kkkk在线观看| 国产一区二区免费| 中文字幕久久亚洲| 成人欧美一区二区三区在线湿哒哒| 国产精品免费电影| 欧美野外wwwxxx| 欧美床上激情在线观看| 国产精品成人观看视频国产奇米| 久久久之久亚州精品露出| 欧美性视频网站| 欧美日韩国产成人在线| 国产午夜精品全部视频在线播放| 亚洲一区二区日本| 欧美精品一二区| 91av在线不卡| 成人在线激情视频| 国产一区二区三区直播精品电影| 亚洲天堂av电影| 国产精品69久久| 国产成人精品免费久久久久| 亚洲人成网在线播放| 久久久久999| 在线日韩日本国产亚洲| 国产精品亚洲视频在线观看|