package com.jxesb.mina.appUdp;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.apache.mina.common.ExpiringSessionRecycler;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.DatagramSessionConfig;
import org.apache.mina.transport.socket.nio.NioDatagramAcceptor;
import com.jxesb.common.utils.SysContext;
public class AppUdpInit {
/**
* @Title: acceptorInit
* @Description: mina服务器初使化
* @param
* @return void
* @author wangzhiwen
* @date 2015-11-2 上午11:30:03
* @throws
*/
public static void acceptorInit() {
try {
NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
acceptor.setHandler(new AppServerHandler());
acceptor.setSessionRecycler(new ExpiringSessionRecycler(1800));//会话过期时间
Executor threadPool = Executors.newCachedThreadPool();
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
chain.addLast("appUdpLogger", new LoggingFilter());
chain.addLast("appUdpCodec", new ProtocolCodecFilter(new AppTextFactory()));
chain.addLast("appUdpThreadPool", new ExecutorFilter(threadPool));
DatagramSessionConfig dcfg = acceptor.getSessionConfig();
dcfg.setReadBufferSize(4096);// 设置接收最大字节默认2048
dcfg.setMaxReadBufferSize(65536);
dcfg.setReceiveBufferSize(1024);// 设置输入缓冲区的大小
dcfg.setSendBufferSize(1024);// 设置输出缓冲区的大小
dcfg.setReuseAddress(true);// 设置每一个非主监听连接的端口可以重用
acceptor.bind(new InetSocketAddress(9999));
SysContext.logger.error("UDPServer listening on port " + 9999);
} catch (Exception e) {
SysContext.logger.error("app udp:",e.fillInStackTrace());
}
}
public static void main(String[] args) throws IOException {
acceptorInit();
}
}
package com.jxesb.mina.appUdp;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.common.IoSession;
import com.jxesb.common.utils.StringUtil;
/**
* @Description: 单例工具类,保存所有mina客户端连接
* @author wangzhiwen
* @date 2014-9-29 上午10:09:15
*
*/
public class AppUdpSessionMap {
private final static Log log = LogFactory.getLog(AppUdpSessionMap.class);
private static AppUdpSessionMap sessionMap = null;
//保存会话
private Map<String, IoSession> map = new HashMap<String, IoSession>();
//保存会话与key值 ,用以删除,以免删除要查询所有值
private Map<Long, String> bindKeyMap = new HashMap<Long, String>();
// 构造私有化 单例
private AppUdpSessionMap() {
synchronized ("mapInit") {
if (map == null) {
map = new HashMap<String, IoSession>();
}
if (bindKeyMap == null) {
bindKeyMap = new HashMap<Long, String>();
}
}
}
/**
* @Description: 获取唯一实例
* @author whl
* @date 2014-9-29 下午1:29:33
*/
public static AppUdpSessionMap instance() {
log.debug("SessionMap单例获取---");
if (sessionMap == null) {
sessionMap = new AppUdpSessionMap();
}
return sessionMap;
}
/**
* @Description: 保存session会话
* @author whl
* @date 2014-9-29 下午1:31:05
*/
public void addSession(String key, IoSession session) {
log.debug("保存会话到SessionMap单例---key=" + key);
this.bindKeyMap.remove(session.getId());
this.map.remove(key);
this.bindKeyMap.put(session.getId(), key);
this.map.put(key, session);
}
/**
* @Title: delSessionById
* @Description: 删除缓存中的对象
* @param
* @param id
* @return void
* @author wangzhiwen
* @date 2015-11-6 下午03:59:17
* @throws
*/
public void delSessionById(long id) {
try{
String key = bindKeyMap.get(id);
if (StringUtil.isNotEmpty(key)) {
bindKeyMap.remove(id);
map.remove(key);
log.debug("删除---key=" + key);
}
}catch (Exception e) {
log.debug("mina 删除---key错误",e.fillInStackTrace());
}
}
/**
* @Description: 根据key查找缓存的session
* @author whl
* @date 2014-9-29 下午1:31:55
*/
public IoSession getSession(String key) {
log.debug("获取会话从SessionMap单例---key=" + key);
return this.map.get(key);
}
/**
* @Description: 发送消息到客户端
* @author whl
* @date 2014-9-29 下午1:57:51
*/
public void sendMessage(String[] keys, Object message) {
for (String key : keys) {
IoSession session = getSession(key);
log.debug("反向发送消息到客户端Session---key=" + key + "----------消息=" + message);
if (session == null) {
return;
}
session.write(message);
}
}
/**
* @Description: 发送消息到客户端
* @author whl
* @date 2014-9-29 下午1:57:51
*/
public void sendMessage(String key, Object message) {
IoSession session = getSession(key);
log.debug("反向发送消息到客户端Session---key=" + key + "----------消息=" + message);
if (session == null) {
return;
}
session.write(message);
}
}
package com.jxesb.mina.appUdp;
import java.nio.ByteBuffer;
import org.apache.mina.common.IoBuffer;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import com.jxesb.common.baseclass.ServiceFacade;
import com.jxesb.common.utils.StringUtil;
public class AppTextDecoder implements ProtocolDecoder {
/**
* 服务器接收到信息,并返回信息
*/
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
throws Exception {
ByteBuffer buf = in.buf();
byte[] msg = new byte[buf.limit()];
buf.get(msg);
String ss = new String(msg, "UTF-8");
String rvt = ServiceFacade.getIndexService().appIndex(ss, session);
if (StringUtil.isNotEmpty(rvt)) {
session.write(rvt);
}
}
public void dispose(IoSession arg0) throws Exception {
}
public void finishDecode(IoSession arg0, ProtocolDecoderOutput arg1)
throws Exception {
}
}
package com.jxesb.mina.appUdp;
import org.apache.mina.common.IoBuffer;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
public class AppTextEncoder implements ProtocolEncoder {
public void dispose(IoSession arg0) throws Exception {
}
/**
* 服务器往客户端发送信息
*/
public void encode(IoSession arg0, Object message, ProtocolEncoderOutput out)
throws Exception {
String msg = message.toString();
byte[] bu = msg.getBytes("UTF-8");
IoBuffer buffer = IoBuffer.wrap(bu);
out.write(buffer);
out.flush();
}
}
package com.jxesb.mina.appUdp;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import com.jxesb.common.utils.SysContext;
/**
* @ClassName: AppServerHandler
* @Description:
* @author wangzhiwen
* @date 2015-11-24 上午10:03:27
*
*/
public class AppServerHandler extends IoHandlerAdapter {
/**
* 服务端收到信息
*/
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
/*String msg = message.toString();
// SystemCacheUtil.setIoSessionMapCache(msg, session);
// String msgName = new MsgName().parseXML(msg);
if (message.equals("Register")) {
// String msgRe = new RegisterReMsg().createDocument();
session.write("123456");
} else {
System.out.println("============ server recive msg ===================");
System.out.println(msg);
}*/
}
/**
* 服务端发消息到客户端
*/
@Override
public void messageSent(IoSession session, Object message) throws Exception {
SysContext.logger.debug("========= server send msg:: " + message);
}
/**
* 连接打开
*/
@Override
public void sessionOpened(IoSession session) throws Exception {
SysContext.logger.debug("======= server session opern:: " + session);
}
/**
* 远程session关闭了一个
*/
@Override
public void sessionClosed(IoSession session) throws Exception {
AppUdpSessionMap.instance().delSessionById(session.getId());
SysContext.logger.debug("远程session关闭了一个..." + session.getRemoteAddress().toString());
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
SysContext.logger.debug("app服务器发送异常:: " + cause.getMessage());
AppUdpSessionMap.instance().delSessionById(session.getId());
//cause.printStackTrace();
}
}
package com.jxesb.mina.appUdp;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolEncoder;
public class AppTextFactory implements ProtocolCodecFactory {
public ProtocolDecoder getDecoder(IoSession arg0) throws Exception {
return new AppTextDecoder();
}
public ProtocolEncoder getEncoder(IoSession arg0) throws Exception {
return new AppTextEncoder();
}
}