最近由于公司业务需要,开始学习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";
@Override
public void sessionOpened(IoSession session) {
logger.info("发现用户登录843服务器");
}
/**
* Trap exceptions.
*/
@Override
public 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.
*/
@Override
public 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);
} else
session.write(SECURITY_FILE);
}
/**
* On idle, we just write a message on the console
*/
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
System.out.println("IDLE " + session.getIdleCount(status));
}
}