最近由於公司業務需要,開始學習mima架構 ,貼上一個簡單的入門執行個體.
該執行個體主要實現的功能是:
開啟一個843監聽連接埠,其作用是為FLEX的安全沙箱機制提供策略檔案(可不管這是幹什麼的)。
WebFlex843Server類
package com.demo.service843;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.log4j.Logger;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class WebFlex843Server {private final static Logger logger = Logger.getLogger(WebFlex843Server.class);//連接埠號碼private final static int PORT = 843;public void startWf843Server() {// 非阻塞的IoAcceptor acceptor = new NioSocketAcceptor();// 過濾器,客服端上傳上來的資訊必須以">"結尾;且伺服器端下發的資訊末尾自動加上">"acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), ">", ">")));// 綁定邏輯處理器acceptor.setHandler(new WebFlex843ServerHandler());// 設定緩衝區大小和讀寫通道10秒內無操作進入空閑狀態acceptor.getSessionConfig().setReadBufferSize(2048);acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);// 綁定連接埠try {acceptor.bind(new InetSocketAddress(PORT));} catch (IOException e) {logger.info("異常:WebFlex伺服器綁定連接埠號碼:" + PORT + ",出現異常");return;}logger.info("WebFlxe843伺服器已啟動,監聽連接埠" + PORT + " ...");}
FlexServerHandler 類
package com.demo.service843;import org.apache.log4j.Logger;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;public class WebFlex843ServerHandler extends IoHandlerAdapter {private final static Logger logger = Logger.getLogger(WebFlex843ServerHandler.class);/** * AS要接收\0結尾的字串 */private static final String SECURITY_FILE = "<?xml version=\"1.0\"?>"+ "<cross-domain-policy>"+ "<site-control permitted-cross-domain-policies=\"all\"/>"+ "<allow-access-from domain=\"*\" to-ports=\"*\" />"+ "</cross-domain-policy>\0";@Overridepublic void sessionOpened(IoSession session) {logger.info("發現使用者登入843伺服器");}/** * Trap exceptions. */@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {cause.printStackTrace();session.close(true);if (cause.getMessage().indexOf("遠程主機強迫關閉") >= 0) {logger.info("偵測到:本地Web-Flex的Client的Session關閉,自動關閉其串連的session");}}/** * If the message is 'quit', we exit by closing the session. Otherwise, we * return the current date. */@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {String msg = message.toString();if (msg.length() < 0)return;if (msg.contains("<policy-file-request/>")) {session.write(SECURITY_FILE);} elsesession.write(SECURITY_FILE);}/** * On idle, we just write a message on the console */@Overridepublic void sessionIdle(IoSession session, IdleStatus status)throws Exception {System.out.println("IDLE " + session.getIdleCount(status));}}