mina TCP实例

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);
	}
}

猜你喜欢

转载自blog.csdn.net/ayay_870621/article/details/89179926