package com.jxesb.mina.app;
import java.net.InetSocketAddress;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import com.jxesb.common.utils.PropertyUtils;
import com.jxesb.common.utils.SysContext;
public class AppIoAcceptorInit {
/**
* @Title: acceptorInit
* @Description: mina服务器初使化
* @param
* @return void
* @author wangzhiwen
* @date 2015-11-2 上午11:30:03
* @throws
*/
public static void acceptorInit() {
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getSessionConfig().setReadBufferSize(1024000);
acceptor.getFilterChain().addLast("appIoAcceptorSocket",
new ProtocolCodecFilter(new AppTextFactory()));//指定编码过滤器
acceptor.setHandler(new AppServerHandler());//指定业务逻辑处理器
try {
acceptor.bind(new InetSocketAddress(Integer.parseInt(PropertyUtils.getProperty("appSocketPort"))));
SysContext.logger.error("========= app socket 服务器端绑定" + PropertyUtils.getProperty("appSocketPort") + "成功 :: ");
} catch (Exception e) {
SysContext.logger.error("app socket:",e.fillInStackTrace());
}
}
}
package com.jxesb.mina.app;
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.app;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.transport.socket.SocketSessionConfig;
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);
}*/
}
/**
* (非 Javadoc)
* <p>Title: sessionCreated</p>
* <p>Description: 创建服务</p>
* @param session
* @throws Exception
* @see org.apache.mina.common.IoHandlerAdapter#sessionCreated(org.apache.mina.common.IoSession)
* @author wagnzhiwen
* @date 2015-12-31 上午09:53:53
*/
@Override
public void sessionCreated(IoSession session) throws Exception {
SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();
cfg.setUseReadOperation(true);//读写是否同步
cfg.setWriteTimeout(30);//写操作超时时间
cfg.setIdleTime(IdleStatus.BOTH_IDLE, 1800);//设置空闲时间
cfg.setKeepAlive(true);//设置空闲是否断开
cfg.setSoLinger(0);//未处理完的数据会丢失
cfg.setTcpNoDelay(true);
SysContext.logger.debug("app服务器创建连接:: ");
super.sessionCreated(session);
}
/**
* 服务端发消息到客户端
*/
@Override
public void messageSent(IoSession session, Object message) throws Exception {
SysContext.logger.debug("app服务器发送成功:: " + 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 {
AppSessionMap.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());
AppSessionMap.instance().delSessionById(session.getId());
//super.exceptionCaught(session, cause);
}
/**
* (非 Javadoc)
* <p>Title: sessionIdle</p>
* <p>Description: 空闲调用此方法</p>
* @param session
* @param status
* @throws Exception
* @see org.apache.mina.common.IoHandlerAdapter#sessionIdle(org.apache.mina.common.IoSession, org.apache.mina.common.IdleStatus)
* @author wagnzhiwen
* @date 2015-12-31 上午09:46:50
*/
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
session.close();
SysContext.logger.debug("app服务器连接空闲:: ");
super.sessionIdle(session, status);
}
}
package com.jxesb.mina.app;
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.app;
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();
}
}
package com.jxesb.mina.app;
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 AppSessionMap {
private final static Log log = LogFactory.getLog(AppSessionMap.class);
private static AppSessionMap sessionMap = null;
//保存会话
private Map<String, IoSession> map = null;
//保存会话与key值 ,用以删除,以免删除要查询所有值
private Map<Long, String> bindKeyMap = null;
// 构造私有化 单例
private AppSessionMap() {
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 AppSessionMap instance() {
log.debug("SessionMap单例获取---");
if (sessionMap == null) {
sessionMap = new AppSessionMap();
}
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.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.error("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);
}
}