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

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

Apache Mina通信框架架構與應用

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品国产免费| 国产精品va在线播放| 欧美日韩加勒比精品一区| 成人a在线观看| 国产精品白嫩美女在线观看| 日韩国产精品视频| 亚洲精品自产拍| 97在线视频免费观看| 国产精品xxx视频| 91爱视频在线| 亚洲色图50p| 91免费的视频在线播放| 精品久久久精品| 亚洲男人天堂手机在线| 日韩黄色在线免费观看| 亚洲欧美制服另类日韩| 91高清在线免费观看| 久久久91精品国产一区不卡| 亚洲第一网站免费视频| 亚洲精品一区av在线播放| 精品久久久久久亚洲国产300| 日韩精品福利网站| 亚洲国产精彩中文乱码av| 国产精品老牛影院在线观看| 草民午夜欧美限制a级福利片| 色中色综合影院手机版在线观看| 91av中文字幕| 国产在线精品自拍| 久久久久久国产精品三级玉女聊斋| 久久久国产精彩视频美女艺术照福利| 欧美—级高清免费播放| 亚洲国产日韩欧美在线99| 亚洲人高潮女人毛茸茸| 色老头一区二区三区在线观看| 国产精品永久免费在线| 国产精品久久久久av免费| 国产精品永久免费观看| 97超碰蝌蚪网人人做人人爽| 久热精品视频在线免费观看| 亚州av一区二区| 国产精品中文字幕在线观看| 欧美一级黑人aaaaaaa做受| 欧美视频不卡中文| 欧美肥臀大乳一区二区免费视频| 国产成人免费av| 欧美激情在线有限公司| 国产午夜精品免费一区二区三区| 亚洲天堂免费视频| 国产精品久久久久久网站| 亚洲欧美国产一本综合首页| 日韩精品在线视频| 日韩在线欧美在线国产在线| 成人欧美一区二区三区黑人| 亚洲国产成人精品电影| 久久久精品视频成人| 国产精品99久久久久久白浆小说| 亚洲精品电影网| 日本久久久久久久久久久| 亚洲日本欧美日韩高观看| 欧美电影免费观看高清完整| www国产亚洲精品久久网站| 中文亚洲视频在线| 国外成人在线播放| 久久男人的天堂| 日本精品久久电影| 亚洲乱码av中文一区二区| 国产精品国产三级国产aⅴ浪潮| 亚洲精品日韩av| 国产色视频一区| 国产xxx69麻豆国语对白| 日韩一二三在线视频播| 精品中文字幕久久久久久| 日韩不卡中文字幕| 欧美日韩精品在线| 88国产精品欧美一区二区三区| 欧美日韩激情视频8区| 日韩成人激情视频| 久久精品国产2020观看福利| 亚洲国语精品自产拍在线观看| 狠狠躁18三区二区一区| 亚洲国产精品yw在线观看| 亚洲一区二区久久久久久久| 亚洲va电影大全| 亚洲黄色www网站| 中文字幕9999| 2019中文字幕全在线观看| 久久久久久久久久婷婷| 欧美性极品xxxx娇小| 欧美在线不卡区| 成人性生交xxxxx网站| 欧美日韩精品在线播放| 亚洲色图五月天| 中文字幕日韩欧美在线| 欧美日本亚洲视频| 日韩激情av在线播放| 久久久国产成人精品| 亚洲男人的天堂网站| 国产91免费观看| 欧美成人精品一区二区| 国产成人精品亚洲精品| 日韩av在线免费观看一区| 久久久久久18| 午夜免费在线观看精品视频| 日韩大片在线观看视频| 欧美日韩在线另类| 精品久久久久久久久中文字幕| 国产日产亚洲精品| 亚洲午夜精品视频| 午夜精品蜜臀一区二区三区免费| 国产成人精品a视频一区www| 中文字幕欧美日韩精品| 久久久亚洲国产天美传媒修理工| 亚洲第一中文字幕| 欧美激情视频三区| 91视频免费在线| 浅井舞香一区二区| 懂色av一区二区三区| 国产成人avxxxxx在线看| 91亚洲精品一区| 亚洲四色影视在线观看| 日韩av123| 欧美一区二区大胆人体摄影专业网站| 韩日精品中文字幕| 亚洲福利视频网| 成人福利网站在线观看| 亚洲人a成www在线影院| 一个人看的www欧美| 国产日韩在线观看av| 激情亚洲一区二区三区四区| 久久久久久久亚洲精品| 亚洲综合日韩在线| 国产一区二区丝袜高跟鞋图片| 92福利视频午夜1000合集在线观看| 91地址最新发布| 欧美一级淫片丝袜脚交| 欧美国产日韩一区二区| 在线观看国产成人av片| 在线视频日本亚洲性| 久久精品国亚洲| 久久久久久伊人| 一本色道久久88综合日韩精品| 亚洲国产天堂久久综合| 97视频在线免费观看| 成人欧美在线观看| 国产精品久久99久久| 成人性生交大片免费观看嘿嘿视频| 亚洲天堂免费视频| 欧美日韩在线观看视频| 国产亚洲日本欧美韩国| 精品一区二区三区三区| 成人精品在线观看| 亚洲自拍在线观看| 美女性感视频久久久| 亚洲欧洲日本专区| 国产香蕉精品视频一区二区三区| 国产色婷婷国产综合在线理论片a| 亚洲精品电影网站| 国产精品wwww| 日韩欧美一区二区三区久久| 久久6精品影院| 国语自产精品视频在线看一大j8| 91系列在线播放| 久久手机精品视频| 欧美在线xxx|