import java.util.List;
import java.util.Map;
import net.sf.json.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.webframe.web.util.WebFrameUtils;
import com.berheley.bi.grp.nio.messageUtil.IProcessor;
import com.berheley.bi.grp.nio.messageUtil.IWebMessageHelper;
import com.berheley.bi.grp.nio.messageUtil.SocketManager;
/**
*
* 类功能描述:消息推送核心类
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2013-7-30 下午03:35:40
*/
public class ServerHandler extends IoHandlerAdapter {
private Log log = LogFactory.getLog(ServerHandler.class);
private IWebMessageHelper webMessageHelper;
public IWebMessageHelper getWebMessageHelper() {
return webMessageHelper;
}
public void setWebMessageHelper(IWebMessageHelper webMessageHelper) {
this.webMessageHelper = webMessageHelper;
}
/**
* 接受消息,登陆时执行此方法
*/
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
String msg = message.toString().trim();
if (msg.startsWith("{")) {
String username = JSONObject.fromObject(msg).getString("sd").toString();
SocketManager.getInstance().addUserToOnlineMap(username, session);
List<Map<String,Object>> userList = webMessageHelper.findUserByBinding(username);
if(userList.size()>0){
String jsonMessage = webMessageHelper.changeListToJSONArray(webMessageHelper.findMobileByBinding()).toString();
webMessageHelper.sendMessage(username, jsonMessage, (IProcessor) WebFrameUtils.getBean("webMessage"));
}
}
log.info("<-------------------- Received Message: " + msg + "--------------------->");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
super.sessionCreated(session);
log.info("<--------------------MINA Server Connection Created--------------------->");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
super.sessionOpened(session);
session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 1800); //读写 通道均在1800 秒内无任何操作就进入空闲状态
log.info("<--------------------MINA Server Connection Opened--------------------->");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
this.removeUserBySessionId(session);
session.close(true);
log.info("<--------------------MINA Server Connection Closed--------------------->");
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
this.removeUserBySessionId(session);
session.close(true);
log.info("Session Id: " + session.getId() + "" + cause.getMessage());
log.error(cause);
}
/**
* 超出空闲时间执行
*/
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
this.removeUserBySessionId(session);
session.close(true);
log.info("<--------------------Session Idle--------------------->");
}
/**
*
* @function:移除在线列表,关闭session
* @param session
* @author: mengqingyu 2013-7-30 下午03:35:22
*/
private void removeUserBySessionId(IoSession session) {
SocketManager.getInstance().removeUserBySessionId(session.getId());
}
}
import java.beans.PropertyEditorSupport;
import java.nio.charset.Charset;
/**
*
* 类功能描述:中文编码
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2014-1-15 下午01:42:30
*/
public class CharsetEditor extends PropertyEditorSupport {
private Object value;
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text != null)
this.value = Charset.forName(text);
else
this.value = Charset.forName("UTF-8");
}
@Override
public Object getValue() {
return value;
}
}
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.webframe.web.util.WebFrameUtils;
/**
*
* 类功能描述:获取端口号
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2013-7-30 下午03:42:04
*/
public class MinaHelper {
private static final NioSocketAcceptor acc = (NioSocketAcceptor) WebFrameUtils.getBean("ioAcceptor");
public static int getMinaPort() {
return acc.getDefaultLocalAddress().getPort();
}
}
import net.sf.json.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.session.IoSession;
import com.berheley.bi.grp.nio.mina.ServerHandler;
/**
*
* 类功能描述:消息处理器抽象类
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2013-7-30 下午03:52:59
*/
public abstract class AbstractProcessor implements IProcessor {
protected Log log = LogFactory.getLog(ServerHandler.class);
protected SocketManager manager = SocketManager.getInstance();
public abstract void process(JSONObject jsonMessage, IoSession session);
}
import net.sf.json.JSONObject;
import org.apache.mina.core.session.IoSession;
/**
*
* 类功能描述:统一消息处理接口
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2014-1-15 下午01:42:02
*/
public interface IProcessor {
/**
*
* @function:统一消息处理接口
* @param jsonMessage
* @param session
* @author: mengqingyu 2013-7-30 下午03:56:10
*/
public void process(JSONObject jsonMessage, IoSession session);
}
import net.sf.json.JSONObject;
import org.apache.mina.core.session.IoSession;
import org.springframework.stereotype.Component;
/**
*
* 类功能描述:消息提醒处理器
*
* @author <a href="mailto:qingyu.meng21@gmail.com">mengqingyu </a>
* @version $Id: codetemplates.xml,v 1.1 2009/03/06 01:13:01 mengqingyu Exp $
* Create: 2013-7-3 下午04:04:50
*/
@Component("webMessage")
public class WebMessageProcessor extends AbstractProcessor {
@Override
public void process(JSONObject jsonMessage, IoSession session) {
if (jsonMessage != null) {
IoSession userSession = manager.getUserSession(jsonMessage.getString("sender"));
if (userSession != null) {
userSession.write(jsonMessage);
log.info("***********************【页面提醒】:" + jsonMessage);
}
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<util:properties id="mina" location="classpath:mina.properties"/>
<bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
init-method="bind" destroy-method="unbind">
<property name="defaultLocalAddress" value="#{mina['mina.server.port']}" />
<property name="handler" ref="serverHandler" />
<property name="filterChainBuilder" ref="minaFilterChainBuilder" />
</bean>
<!-- NIO处理器 -->
<bean id="serverHandler" class="com.berheley.bi.grp.nio.mina.ServerHandler">
<property name="webMessageHelper" ref="webMessageHelper" />
</bean>
<!-- 构造过滤器链-->
<bean id="minaFilterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
<property name="filters">
<map>
<entry key="minaloggingFilter" value-ref="minaloggingFilter" />
<entry key="minaProtocolCodecFilter" value-ref="minaProtocolCodecFilter" />
</map>
</property>
</bean>
<!-- 保证TCP协议所有的包发送方的写操作与接受方的读操作一一对应 -->
<bean id="minaProtocolCodecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
<constructor-arg>
<bean class="org.apache.mina.filter.codec.textline.TextLineCodecFactory">
<constructor-arg index="0" type="java.nio.charset.Charset">
<value>UTF-8</value>
</constructor-arg>
<property name="encoderMaxLineLength" ref="maxValue"></property>
<property name="decoderMaxLineLength" ref="maxValue"></property>
</bean>
</constructor-arg>
</bean>
<util:constant id="maxValue" static-field="java.lang.Integer.MAX_VALUE"/>
<!-- 构造日志过滤器 -->
<bean id="minaloggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" />
<!-- 构造属性编辑器 -->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.net.SocketAddress">
<bean class="org.apache.mina.integration.beans.InetSocketAddressEditor" />
</entry>
<entry key="java.nio.charset.Charset">
<bean class="com.berheley.bi.grp.nio.mina.CharsetEditor" />
</entry>
</map>
</property>
</bean>
</beans>
mina.properties文件内容
mina.server.port=9094
mina.flex.port=840