程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> mina2.0 spring,mina2.0

mina2.0 spring,mina2.0

編輯:JAVA綜合教程

mina2.0 spring,mina2.0


Apache MINA是一個網絡應用程序框架,它可以幫助用戶開發的高性能、高擴展性的網絡應用程序。它提供了一個抽象的事件驅動的異步API在不同傳輸如TCP/IP和UDP/IP通過java NIO。

Apache MINA通常被稱為:

NIO框架庫,
客戶端服務器框架庫,或
一個網絡socket庫

code案例:

test.properties 配置文件

1 #mina2.0
2 mina.server.serverLocationAddress = 127.0.0.1:9998

 

applicationContext.xml 配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
 6         ">
 7 
 8     <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 9          <property name="locations">
10              <value>classpath:propertiesConfig/test.properties</value>
11          </property>
12     </bean>
13     <!-- 定義數據處理Bean -->
14     <bean id="serverHandler" class="com.maven.project.web.mina2.ServerHandler" />
15     
16     <!-- executorFilter多線程處理 -->
17     <bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter" />
18     
19     <bean id="mdcInjectionFilter" class="org.apache.mina.filter.logging.MdcInjectionFilter">
20         <constructor-arg value="remoteAddress" />
21     </bean>
22     
23     <!-- 字符編 碼過濾器 -->
24     <bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
25         <constructor-arg>
26         <!-- <bean class="org.apache.mina.filter.codec.textline.TextLineCodecFactory" />-->
27         <!-- 處理對象流時候用ObjectSerializationCodecFactory -->
28         <!-- <bean class="org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory" /> -->
29             <bean class="com.maven.project.web.mina2.ServerCodeFactory" />
30         </constructor-arg>
31     </bean>
32     
33     <!-- 日志過濾器 -->
34     <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" />
35     
36     <!-- 過濾器鏈 -->
37     <bean id="filterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
38         <property name="filters">
39             <map>
40                 <entry key="executor" value-ref="executorFilter" />
41                 <entry key="mdcInjectionFilter" value-ref="mdcInjectionFilter" />
42                 <entry key="codecFilter" value-ref="codecFilter" />
43                 <entry key="loggingFilter" value-ref="loggingFilter" />
44             </map>
45         </property>
46     </bean>
47     
48     <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
49         <property name="customEditors">
50             <map>
51                <entry key="java.net.SocketAddress" value="org.apache.mina.integration.beans.InetSocketAddressEditor"/>
52              </map>
53         </property>
54     </bean>
55     
56     <!-- session config 通過工廠方法注入 -->
57     <bean id="sessionConfig" factory-bean="ioAcceptor" factory-method="getSessionConfig" >
58         <property name="bothIdleTime" value="180"/><!-- 配置session 空閒時間,單位 秒 -->
59     </bean>
60     
61     <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor" init-method="bind" destroy-method="unbind">
62         <property name="defaultLocalAddress" value="${mina.server.serverLocationAddress}" />
63         <property name="handler" ref="serverHandler" />
64         <property name="filterChainBuilder" ref="filterChainBuilder" />
65         <property name="reuseAddress" value="true" />
66     </bean>
67 </beans>

 

maven pom.xml 配置文件

 1     <properties>
 2         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 3         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 4         <mina-version>2.0.13</mina-version>
 5         <mina-groupId>org.apache.mina</mina-groupId>
 6     </properties>
 7 <!-- mina -->
 8         <dependency>
 9             <groupId>${mina-groupId}</groupId>
10             <artifactId>mina-core</artifactId>
11             <version>${mina-version}</version>
12         </dependency>
13         <dependency>
14             <groupId>${mina-groupId}</groupId>
15             <artifactId>mina-integration-beans</artifactId>
16             <version>${mina-version}</version>
17         </dependency>

 

handler 業務處理類 

 1 package com.maven.project.web.mina2;
 2 
 3 import org.apache.mina.core.service.IoHandlerAdapter;
 4 import org.apache.mina.core.session.IdleStatus;
 5 import org.apache.mina.core.session.IoSession;
 6 
 7 public class ServerHandler extends IoHandlerAdapter {
 8 
 9     /**當一個新客戶端連接後觸發此方法*/
10     @Override 
11     public void sessionCreated(IoSession session) throws Exception {
12         System.out.println("===============sessionCreated=============");
13     }
14 
15     /**當連接後打開時觸發此方法,一般此方法與 sessionCreated 會被同時觸發*/
16     @Override
17     public void sessionOpened(IoSession session) throws Exception {
18         System.out.println("===============sessionOpened=============");
19     }
20 
21     /**當連接被關閉時觸發,例如客戶端程序意外退出等等*/
22     @Override
23     public void sessionClosed(IoSession session) throws Exception {
24         System.out.println("===============sessionClosed=============");
25         if(null != session){
26             session.closeOnFlush();
27         }
28     }
29 
30     /**當連接空閒時觸發此方法*/
31     @Override
32     public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
33         System.out.println("===============sessionIdle=============");
34         this.sessionClosed(session);
35     }
36 
37     /**當接口中其他方法拋出異常未被捕獲時觸發此方法*/
38     @Override
39     public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
40         System.out.println("===============exceptionCaught=============");
41         this.sessionClosed(session);
42     }
43 
44     /**當接收到客戶端的請求信息後觸發此方法*/
45     @Override
46     public void messageReceived(IoSession session, Object message) throws Exception {
47         System.out.println("===============messageReceived============="+message);
48     }
49 
50     /**當信息已經傳送給客戶端後觸發此方法*/
51     @Override
52     public void messageSent(IoSession session, Object message) throws Exception {
53         System.out.println("===============messageSent=============");
54     }
55 
56     @Override
57     public void inputClosed(IoSession session) throws Exception {
58         System.out.println("===============inputClosed=============");
59         this.sessionClosed(session);
60     }
61 
62 }

  

encode 類

 1 package com.maven.project.web.mina2;
 2 
 3 import java.nio.charset.Charset;
 4 
 5 import org.apache.mina.core.buffer.IoBuffer;
 6 import org.apache.mina.core.session.IoSession;
 7 import org.apache.mina.filter.codec.ProtocolEncoder;
 8 import org.apache.mina.filter.codec.ProtocolEncoderOutput;
 9 
10 public class ServerEnCoder implements ProtocolEncoder {
11 
12     private Charset charset = null;
13 
14     public ServerEnCoder(Charset charset) {
15         this.charset = charset;
16     }
17 
18     @Override
19     public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
20         IoBuffer buf = IoBuffer.allocate(message.toString().getBytes().length).setAutoExpand(true);
21         buf.putString(message.toString(), charset.newEncoder());
22         buf.flip();
23         out.write(buf);
24         return;
25     }
26 
27     @Override
28     public void dispose(IoSession session) throws Exception { }
29 
30 }

 

decode 類

 1 package com.maven.project.web.mina2;
 2 
 3 import java.nio.charset.Charset;
 4 
 5 import org.apache.mina.core.buffer.IoBuffer;
 6 import org.apache.mina.core.session.IoSession;
 7 import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
 8 import org.apache.mina.filter.codec.ProtocolDecoderOutput;
 9 
10 public class ServerDecoder extends CumulativeProtocolDecoder {
11 
12     private static final int HANDLENGTH = 4;
13 
14     private Charset charset = null;
15 
16     public ServerDecoder(Charset charset) {
17         this.charset = charset;
18     }
19 
20     @Override
21     protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
22         if (in.remaining() < HANDLENGTH) {
23             return false;
24         }
25         byte[] sizeBytes = new byte[HANDLENGTH];
26         in.mark();// 標記當前位置,以便reset
27         in.get(sizeBytes, 0, HANDLENGTH);// 讀取4字節
28         int size = Integer.parseInt(new String(sizeBytes, this.charset));
29         in.reset();
30         if (size > in.remaining()) {// 如果消息內容不夠,則重置,相當於不讀取size
31             return false;// 父類接收新數據,以拼湊成完整數據
32         } else {
33             byte[] bytes = new byte[size];
34             in.get(bytes, 0, size);
35             out.write(new String(bytes, this.charset));
36             if (in.remaining() > 0) {// 如果讀取內容後還粘了包,就讓父類再重讀 一次,進行下一次解析
37                 return true;
38             }
39         }
40         return false;// 處理成功,讓父類進行接收下個包
41     }
42 }

 

編碼過濾工廠

 1 package com.maven.project.web.mina2;
 2 
 3 import java.nio.charset.Charset;
 4 
 5 import org.apache.mina.core.session.IoSession;
 6 import org.apache.mina.filter.codec.ProtocolCodecFactory;
 7 import org.apache.mina.filter.codec.ProtocolDecoder;
 8 import org.apache.mina.filter.codec.ProtocolEncoder;
 9 
10 public class ServerCodeFactory implements ProtocolCodecFactory {
11 
12     private ServerEnCoder encoder;
13     
14     private ServerDecoder decoder;
15     
16     public ServerCodeFactory(){
17         this(Charset.defaultCharset().name());
18     }
19     
20     public ServerCodeFactory(String charsetName){
21         encoder = new ServerEnCoder(Charset.forName(charsetName));
22         decoder = new ServerDecoder(Charset.forName(charsetName));
23     }
24     
25     @Override
26     public ProtocolEncoder getEncoder(IoSession session) throws Exception {
27         return encoder;
28     }
29 
30     @Override
31     public ProtocolDecoder getDecoder(IoSession session) throws Exception {
32         return decoder;
33     }
34 
35 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved