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

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

Apache Mina通信框架架構與應用

2019-11-10 20:10:45
字體:
來源:轉載
供稿:網友

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
中文字幕日韩有码| 国a精品视频大全| 日本中文字幕不卡免费| 日韩av手机在线看| 69av成年福利视频| 韩日精品中文字幕| 亚洲人成网站免费播放| 国产精品专区一| 成人夜晚看av| 国产女同一区二区| 国产欧美久久一区二区| 日韩精品在线视频观看| 国产精品中文字幕在线| 国产成人一区二区在线| 亚洲欧美激情视频| 在线看欧美日韩| 91tv亚洲精品香蕉国产一区7ujn| 欧美一级在线亚洲天堂| 亚洲电影免费观看高清| 久久久999国产| 亚洲欧美精品suv| 日韩av观看网址| 深夜福利国产精品| 欧美成年人视频网站欧美| 欧美性猛交xxxx黑人| 成人福利免费观看| 午夜精品视频网站| 国产精品久久久久秋霞鲁丝| 亚洲第一偷拍网| 91精品国产91久久久久久吃药| 欧美视频中文在线看| 亚洲全黄一级网站| 91网站免费观看| 国产精品视频精品视频| 97超级碰在线看视频免费在线看| 欧美日韩激情美女| 成人性生交大片免费看小说| 国产深夜精品福利| 欧美最顶级的aⅴ艳星| 国产精品日本精品| 欧美精品videos另类日本| 久久久久久免费精品| 国产成人精品久久| 伊人久久五月天| 亚洲va欧美va在线观看| 91在线免费网站| 日韩中文字幕在线播放| 韩国日本不卡在线| 久久久久久久亚洲精品| 欧美日韩综合视频网址| 亚洲综合精品伊人久久| 欧美二区在线播放| 日韩在线播放一区| 日韩在线中文视频| 久久久免费高清电视剧观看| 国产不卡一区二区在线播放| 狠狠躁夜夜躁人人爽天天天天97| 日韩高清人体午夜| 国产精品99蜜臀久久不卡二区| 亚洲夜晚福利在线观看| 中日韩美女免费视频网址在线观看| 性色av一区二区三区红粉影视| 一区二区成人精品| 这里只有精品视频在线| 亚洲国产成人在线视频| 亚洲欧美日韩网| 亚洲性夜色噜噜噜7777| 国产日韩av高清| 亚洲码在线观看| 日韩成人中文电影| 久久久久久久久爱| 日韩网站在线观看| 亚洲人成网站免费播放| 欧美日韩中文在线观看| 久久久在线免费观看| 欧美极品少妇与黑人| 欧美激情视频给我| 国产成人久久久精品一区| 国产日韩欧美中文在线播放| 欧美二区在线播放| 国产不卡在线观看| 黑人巨大精品欧美一区二区三区| 久久精品成人动漫| 97免费在线视频| 久久亚洲精品小早川怜子66| 九九热精品在线| 亚洲高清色综合| 亚洲成人中文字幕| 精品久久久久久久久国产字幕| 2018中文字幕一区二区三区| 欧美激情第三页| 国产在线999| 欧美xxxx18国产| 久久久人成影片一区二区三区| 国产精品免费久久久久久| 日本视频久久久| 欧美大荫蒂xxx| 国产中文字幕日韩| 国产精品老女人精品视频| 亚洲无亚洲人成网站77777| 日韩中文字幕在线观看| 中文字幕欧美精品日韩中文字幕| 尤物精品国产第一福利三区| 日韩中文字幕在线精品| 狠狠色狠色综合曰曰| 亚洲国产一区自拍| 日韩电视剧免费观看网站| 成人女保姆的销魂服务| 久久人人爽亚洲精品天堂| 欧美一级大片在线观看| 国产999精品视频| 亚洲精品小视频在线观看| 色综合色综合久久综合频道88| 久久精品电影一区二区| 久久久久中文字幕| 久久久精品国产网站| 国语自产精品视频在线看一大j8| 亚洲精品www久久久久久广东| 久久久久国产精品免费网站| 成人av资源在线播放| 中文字幕亚洲综合久久筱田步美| 高清视频欧美一级| 色爱精品视频一区| 国产精品久久国产精品99gif| 爽爽爽爽爽爽爽成人免费观看| 欧美性受xxxx白人性爽| 亚洲第一精品夜夜躁人人爽| 欧美日韩亚洲成人| 91免费综合在线| 久久精品国产清自在天天线| 亚洲国内精品在线| 国产综合在线视频| 狠狠色噜噜狠狠狠狠97| 亚洲欧洲国产精品| 91色精品视频在线| 久久久av亚洲男天堂| 毛片精品免费在线观看| 欧洲成人在线视频| 91地址最新发布| 国产精品91久久久| 中文字幕欧美专区| 日韩精品在线观看视频| 国产精品女人久久久久久| 久久99国产综合精品女同| 国产丝袜一区视频在线观看| 日韩成人黄色av| 久久精品国产精品亚洲| 亚洲国产中文字幕在线观看| 国产亚洲美女久久| 亚洲国产一区自拍| 影音先锋欧美在线资源| 欧美成人亚洲成人日韩成人| 日韩欧美亚洲范冰冰与中字| 成人黄色中文字幕| 色中色综合影院手机版在线观看| 国产日韩精品在线| 日韩欧美aⅴ综合网站发布| 久久精品国产电影| 国产精品无码专区在线观看| 成人激情电影一区二区| 色综合久久88| 成人久久一区二区三区| 91高清视频在线免费观看| 久久久久成人网|