日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
ApacheMINA實(shí)戰(zhàn)之牛刀小試

Apache的MINA是一個(gè)被用來(lái)構(gòu)建高性能和高可伸縮性應(yīng)用程序的網(wǎng)絡(luò)應(yīng)用框架,它提供了一套統(tǒng)一的建立在Java NIO之上的事件驅(qū)動(dòng)的異步API。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),皮山企業(yè)網(wǎng)站建設(shè),皮山品牌網(wǎng)站建設(shè),網(wǎng)站定制,皮山網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,皮山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

對(duì)于MINA框架的了解,MINA官方的幾篇文章是必須要看的,如下:

* Application Architecture http://mina.apache.org/mina-based-application-architecture.html

* Server Architecture http://mina.apache.org/server-architecture.html

* Client Architecture http://mina.apache.org/client-architecture.html

其中幾個(gè)主要的組件如下:

I/O Service - 用來(lái)處理I/O流,對(duì)于Server端就是IOAcceptor的實(shí)現(xiàn)類(lèi)接受Client端的連接請(qǐng)求,對(duì)于Client端就是IoConnector的實(shí)現(xiàn)類(lèi)來(lái)建立到Server端的連接。

I/O Filter Chain - 用來(lái)過(guò)濾或轉(zhuǎn)化數(shù)據(jù)。對(duì)于Server端和Client端來(lái)說(shuō)都是IoFilter接口的實(shí)現(xiàn)類(lèi),MINA自己內(nèi)建了很多IoFilter接口的實(shí)現(xiàn)類(lèi)。具體可以參考官方文檔。

I/O Handler - 用來(lái)處理真正業(yè)務(wù)邏輯的類(lèi)。對(duì)于Server端和Client端來(lái)說(shuō)都是IoHandler接口的實(shí)現(xiàn)類(lèi),通常來(lái)說(shuō)需要自己編寫(xiě)。

由于Server端和Client端都是基于以上三個(gè)組件的,因此對(duì)于Server端和Client端編程來(lái)說(shuō)就都有類(lèi)似的代碼結(jié)構(gòu)。

對(duì)于Server端來(lái)說(shuō):

1. 創(chuàng)建I/O service - 這里就是創(chuàng)建IOAcceptor類(lèi)監(jiān)聽(tīng)端口。

2. 創(chuàng)建I/O Filter Chain - 這里就是告訴使用那些IoFilter。

3. 創(chuàng)建I/O Handler - 自己的業(yè)務(wù)邏輯。

對(duì)于Client端來(lái)說(shuō):

1. 創(chuàng)建I/O service - 這里就是創(chuàng)建IOConnector類(lèi)來(lái)建立到Server端的連接。

2. 創(chuàng)建I/O Filter Chain - 這里就是告訴使用那些IoFilter。

3. 創(chuàng)建I/O Handler - 自己的業(yè)務(wù)邏輯。

下面來(lái)通過(guò)一個(gè)例子看看MINA是怎樣工作的。由于大多數(shù)應(yīng)用都是基于TCP/IP的應(yīng)用,所以這里也就不再說(shuō)UDP/IP了。

這里我使用了Maven來(lái)創(chuàng)建了一個(gè)簡(jiǎn)單java應(yīng)用程序,具體步驟請(qǐng)參Maven的官方手冊(cè)。這里只是將我用到的maven配置文件pom.xml列出,方便下面及后續(xù)文章使用。具體pom.xml文件內(nèi)容如下:

 
 
 
  1.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  2.     4.0.0  
  3.     com.google.code.garbagecan.minastudy  
  4.     minastudy  
  5.     jar  
  6.     1.0-SNAPSHOT  
  7.     minastudy  
  8.     http://maven.apache.org  
  9.       
  10.           
  11.             org.apache.mina  
  12.             mina-core  
  13.             2.0.4  
  14.           
  15.           
  16.             org.apache.mina  
  17.             mina-filter-compression  
  18.             2.0.4  
  19.           
  20.           
  21.             org.slf4j  
  22.             slf4j-api  
  23.             1.3.0  
  24.           
  25.           
  26.             org.slf4j  
  27.             slf4j-log4j12  
  28.             1.3.0  
  29.           
  30.       
  31.  

首先來(lái)看Server端的代碼

 
 
 
  1. package com.google.code.garbagecan.minastudy.sample1;  
  2.  
  3. import java.io.IOException;  
  4. import java.net.InetSocketAddress;  
  5. import java.nio.charset.Charset;  
  6.  
  7. import org.apache.mina.core.service.IoAcceptor;  
  8. import org.apache.mina.core.service.IoHandlerAdapter;  
  9. import org.apache.mina.core.session.IdleStatus;  
  10. import org.apache.mina.core.session.IoSession;  
  11. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  12. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
  13. import org.apache.mina.filter.logging.LoggingFilter;  
  14. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  15. import org.slf4j.Logger;  
  16. import org.slf4j.LoggerFactory;  
  17.  
  18. public class MyServer {  
  19.       
  20.     private static final Logger logger = LoggerFactory.getLogger(MyServer.class);  
  21.       
  22.     public static void main(String[] args) {  
  23.         IoAcceptor acceptor = new NioSocketAcceptor();  
  24.  
  25.         acceptor.getFilterChain().addLast("logger", new LoggingFilter());  
  26.         acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));  
  27.  
  28.         acceptor.setHandler(new IoHandlerAdapter() {  
  29.               
  30.             @Override 
  31.             public void sessionCreated(IoSession session) throws Exception {  
  32.             }  
  33.               
  34.             @Override 
  35.             public void sessionOpened(IoSession session) throws Exception {  
  36.             }  
  37.  
  38.             @Override 
  39.             public void sessionClosed(IoSession session) throws Exception {  
  40.             }  
  41.  
  42.             @Override 
  43.             public void sessionIdle(IoSession session, IdleStatus status) throws Exception {  
  44.             }  
  45.  
  46.             @Override 
  47.             public void exceptionCaught(IoSession session, Throwable cause) throws Exception {  
  48.                 logger.error(cause.getMessage(), cause);  
  49.                 session.close(true);  
  50.             }  
  51.  
  52.             @Override 
  53.             public void messageReceived(IoSession session, Object message) throws Exception {  
  54.                 logger.info("Received message " + message);  
  55.                 session.write(message);  
  56.             }  
  57.  
  58.             @Override 
  59.             public void messageSent(IoSession session, Object message) throws Exception {  
  60.                 logger.info("Sent message " + message);  
  61.             }  
  62.         });  
  63.           
  64.         try {  
  65.             acceptor.bind(new InetSocketAddress(10000));  
  66.         } catch (IOException ex) {  
  67.             logger.error(ex.getMessage(), ex);  
  68.         }  
  69.     }  

1. 首先創(chuàng)建I/O Service,這里使用的是NioSocketAcceptor類(lèi)來(lái)創(chuàng)建了一個(gè)IoAcceptor實(shí)例。

2. 創(chuàng)建I/O Filter Chain,這里使用了兩個(gè)IoFilter,一個(gè)是LoggingFilter用來(lái)記錄日志和打印事件消息,另一個(gè)是ProtocolCodecFilter實(shí)例用來(lái)編碼數(shù)據(jù),這里其實(shí)就是將傳遞的數(shù)據(jù)編碼成文本。

3. 創(chuàng)建I/O Handler,不要害怕,看起來(lái)代碼多,其實(shí)就是一個(gè)實(shí)現(xiàn)了IoHandler接口的子類(lèi),自己需要實(shí)現(xiàn)其中的一些方法,這里方法比較多,但是我在這里只實(shí)現(xiàn)了messageSent,messageReceived和exceptionCaught方法。

4. ***就是讓IoAcceptor類(lèi)實(shí)例綁定端口實(shí)現(xiàn)監(jiān)聽(tīng)。

#p#

下面看看Client端的代碼

 
 
 
  1. package com.google.code.garbagecan.minastudy.sample1;  
  2.  
  3. import java.net.InetSocketAddress;  
  4. import java.nio.charset.Charset;  
  5.  
  6. import org.apache.mina.core.RuntimeIoException;  
  7. import org.apache.mina.core.future.ConnectFuture;  
  8. import org.apache.mina.core.service.IoConnector;  
  9. import org.apache.mina.core.service.IoHandlerAdapter;  
  10. import org.apache.mina.core.session.IdleStatus;  
  11. import org.apache.mina.core.session.IoSession;  
  12. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  13. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
  14. import org.apache.mina.filter.logging.LoggingFilter;  
  15. import org.apache.mina.transport.socket.nio.NioSocketConnector;  
  16. import org.slf4j.Logger;  
  17. import org.slf4j.LoggerFactory;  
  18.  
  19. public class MyClient {  
  20.       
  21.     private static final Logger logger = LoggerFactory.getLogger(MyClient.class);  
  22.       
  23.     public static void main(String[] args) {  
  24.         IoConnector connector = new NioSocketConnector();  
  25.         connector.setConnectTimeoutMillis(10 * 1000);  
  26.           
  27.         connector.getFilterChain().addLast("logger", new LoggingFilter());  
  28.         connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));  
  29.           
  30.         connector.setHandler(new IoHandlerAdapter() {  
  31.               
  32.             @Override 
  33.             public void sessionCreated(IoSession session) throws Exception {  
  34.             }  
  35.  
  36.             @Override 
  37.             public void sessionOpened(IoSession session) throws Exception {  
  38.                 for (int i = 0; i < 10; i++) {  
  39.                     session.write("Hello user_" + i);  
  40.                 }  
  41.                 session.write("Bye");  
  42.             }  
  43.  
  44.             @Override 
  45.             public void sessionClosed(IoSession session) throws Exception {  
  46.             }  
  47.  
  48.             @Override 
  49.             public void sessionIdle(IoSession session, IdleStatus status) throws Exception {  
  50.             }  
  51.  
  52.             @Override 
  53.             public void exceptionCaught(IoSession session, Throwable cause) throws Exception {  
  54.                 logger.error(cause.getMessage(), cause);  
  55.                 session.close(true);  
  56.             }  
  57.  
  58.             @Override 
  59.             public void messageReceived(IoSession session, Object message) throws Exception {  
  60.                 logger.info("Received message " + message);  
  61.                 if (message.toString().equalsIgnoreCase("Bye")) {  
  62.                     session.close(true);  
  63.                 }  
  64.             }  
  65.  
  66.             @Override 
  67.             public void messageSent(IoSession session, Object message) throws Exception {  
  68.                 logger.info("Sent message " + message);  
  69.             }  
  70.         });  
  71.  
  72.         IoSession session = null;  
  73.         try {  
  74.             ConnectFuture future = connector.connect(new InetSocketAddress("localhost", 10000));  
  75.             future.awaitUninterruptibly();  
  76.             session = future.getSession();  
  77.         } catch (RuntimeIoException e) {  
  78.             logger.error(e.getMessage(), e);  
  79.         }  
  80.  
  81.         session.getCloseFuture().awaitUninterruptibly();  
  82.         connector.dispose();  
  83.     }  

1. 首先創(chuàng)建I/O Service,這里使用的是NioSocketConnector類(lèi)來(lái)創(chuàng)建了一個(gè)IoConnector實(shí)例,并設(shè)置連接超時(shí)為10秒。

2. 創(chuàng)建I/O Filter Chain,和服務(wù)器端同樣設(shè)置了兩個(gè)IoFilter,一個(gè)是LoggingFilter用來(lái)記錄日志和打印事件消息,另一個(gè)是ProtocolCodecFilter實(shí)例用來(lái)編碼數(shù)據(jù),這里其實(shí)就是將傳遞的數(shù)據(jù)編碼成文本。

3. 創(chuàng)建I/O Handler,也不要害怕,看起來(lái)代碼多,其實(shí)也是一個(gè)實(shí)現(xiàn)了IoHandler接口的子類(lèi),并且自己實(shí)現(xiàn)了sessionOpened,messageSent,messageReceived和exceptionCaught方法。實(shí)現(xiàn)sessionOpened方法是為了在建立連接后向Server端發(fā)送消息。另外看一下messageReceived方法實(shí)現(xiàn),在接收到服務(wù)器端的消息后關(guān)閉會(huì)話(huà)。從而可以使Client程序最終能夠退出。

4. ***就是IoConnector實(shí)例類(lèi)連接遠(yuǎn)端的Server。

下面測(cè)試一下上面的程序,首先運(yùn)行MyServer類(lèi),然后運(yùn)行MyClient類(lèi),就可以分別在各自的終端上看到事件日志以及發(fā)送/接收的消息了。


文章題目:ApacheMINA實(shí)戰(zhàn)之牛刀小試
網(wǎng)站鏈接:http://www.5511xx.com/article/djscpeg.html