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

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

Apache Mina通信框架架構與應用

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

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
久久久久久中文字幕| 日韩精品中文字幕在线| 欧美国产日产韩国视频| 精品久久久久国产| 国产成人精品视频| 欧美在线一区二区三区四| 欧美黑人xxxⅹ高潮交| 在线观看欧美www| 国产精品福利小视频| 91国产视频在线播放| 亚洲电影免费观看高清完整版在线| 欧洲精品毛片网站| 亚洲第一av网站| 日本午夜精品理论片a级appf发布| 亚洲а∨天堂久久精品喷水| 欧美成人激情视频免费观看| 欧美精品成人91久久久久久久| 国产精品白嫩初高中害羞小美女| 欧美猛交ⅹxxx乱大交视频| 91av视频在线| 日韩少妇与小伙激情| 亚洲天堂视频在线观看| 91av视频在线| 国产精品欧美一区二区三区奶水| 久久久999精品免费| 国产精品久久久久久久av电影| 久久久亚洲国产天美传媒修理工| 粗暴蹂躏中文一区二区三区| 在线播放精品一区二区三区| 欧美天天综合色影久久精品| 伊人久久免费视频| 国产精品久久9| 国产91精品黑色丝袜高跟鞋| 国产精品免费久久久久久| 最好看的2019的中文字幕视频| 亚洲人成在线一二| 国产在线视频不卡| 国产视频欧美视频| 久久精品福利视频| 国产性色av一区二区| 欧美在线视频在线播放完整版免费观看| 精品国产乱码久久久久久天美| 在线视频欧美日韩精品| 欧美裸身视频免费观看| 永久免费精品影视网站| 最近2019中文字幕大全第二页| 亚洲性线免费观看视频成熟| 久久久噜噜噜久久中文字免| 亚洲最大福利视频| 国产成人精品久久二区二区91| 久久久女人电视剧免费播放下载| 中文字幕在线成人| 精品亚洲国产成av人片传媒| 91最新在线免费观看| 成人情趣片在线观看免费| 亚洲精品一区二区三区婷婷月| 91高清在线免费观看| 狠狠综合久久av一区二区小说| 久久久久这里只有精品| 欧美亚洲国产日韩2020| 亚洲性线免费观看视频成熟| 欧美激情第99页| 国产福利精品在线| 久久精品视频网站| 91高潮在线观看| 日本最新高清不卡中文字幕| 黑人狂躁日本妞一区二区三区| 欧美成人手机在线| 中文字幕久精品免费视频| 亚洲视频在线观看| 国产一区二区久久精品| 欧美精品一二区| 成人久久18免费网站图片| 欧美美女操人视频| 国产精品色悠悠| www亚洲精品| 91在线观看欧美日韩| 国产精品高潮呻吟视频| 精品日本高清在线播放| 欧美性生交大片免网| 亚洲free性xxxx护士hd| 中文字幕在线看视频国产欧美在线看完整| 日韩在线观看免费高清完整版| 久久久www成人免费精品| 98视频在线噜噜噜国产| 亚洲精品美女久久久久| 中文.日本.精品| 91亚洲精品一区二区| 国产精品一久久香蕉国产线看观看| 国产免费亚洲高清| 国色天香2019中文字幕在线观看| 欧美成人在线影院| 国产精品狠色婷| 欧美亚洲成人xxx| 国产精品久久久久久亚洲调教| 欧美性猛交xxxx免费看漫画| 日韩中文字幕视频| 91视频-88av| 一区二区三区天堂av| 欧美激情在线播放| 日日狠狠久久偷偷四色综合免费| 久久久国产精品x99av| 国产激情久久久| 日av在线播放中文不卡| 日韩欧美高清在线视频| 97免费视频在线| 在线免费观看羞羞视频一区二区| 北条麻妃久久精品| 成人福利免费观看| 久久国产精品久久久久久久久久| 91美女片黄在线观看游戏| 2019国产精品自在线拍国产不卡| 成人av.网址在线网站| 亚洲香蕉av在线一区二区三区| 日韩免费在线免费观看| 色综合久久精品亚洲国产| 日韩国产高清污视频在线观看| 亚洲在线视频观看| 久久91亚洲人成电影网站| 精品久久久久久中文字幕一区奶水| 欧美最猛性xxxxx亚洲精品| 欧美成人在线影院| 欧美第一页在线| www.亚洲成人| 在线日韩日本国产亚洲| 日本乱人伦a精品| 97国产在线观看| 欧美日韩免费一区| 欧日韩在线观看| 亚洲a在线观看| 精品久久香蕉国产线看观看gif| 久久伊人精品一区二区三区| 亚洲影影院av| 亚洲美女性生活视频| 欧美精品久久久久久久久| 国产精品久久久久久久久久免费| 日本一区二区三区在线播放| 97av视频在线| 日韩国产在线看| 欧美xxxx综合视频| 成人性生交大片免费观看嘿嘿视频| 日本老师69xxx| 国产成人涩涩涩视频在线观看| 91久久精品国产| 久久久久久香蕉网| 国产美女搞久久| 欧美性极品少妇精品网站| 国产成人精品视频在线| 欧美日韩国产黄| 5566成人精品视频免费| 日本国产一区二区三区| 欧美性xxxxx极品| 欧美日韩亚洲一区二| 国产精品一二三在线| 亚洲欧洲午夜一线一品| www.日韩av.com| 久久精品视频播放| 国产成人精品一区二区在线| 亚洲精品中文字幕有码专区| 免费97视频在线精品国自产拍| 日韩中文字幕在线视频播放| 国产精品日韩在线一区| 欧美日韩激情网| 亚洲人精品午夜在线观看|