`
mengqingyu
  • 浏览: 333115 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

基于FLEX,MINA消息推送核心代码

阅读更多
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
分享到:
评论

相关推荐

    mina消息推送例子

    Mina的核心思想是基于回调的事件模型,允许开发者编写非阻塞式的I/O代码,提高了系统的并发处理能力。 在消息推送场景下,Mina通常扮演服务器端的角色,接收客户端的连接请求,建立长连接,然后通过这些连接向...

    基于Mina的Android消息推送系统的研究与实现.pdf

    【基于Mina的Android消息推送系统】是一种针对移动互联网中消息传输实时性和效率优化的技术解决方案。随着智能手机技术的迅速崛起,尤其是iOS和Android操作系统的普及,移动应用的需求日益增长,传统服务器被动接收...

    Java-mina实现推送

    通过以上步骤,我们可以构建一个基于Java-Mina的服务器,实现服务端主动向客户端推送数据的功能。同时,结合Spring框架,可以实现更灵活和可扩展的应用架构。在实际项目中,还可能涉及其他高级特性,如负载均衡、...

    学习见证消息推送时刻笔记

    【消息推送笔记】这篇笔记主要记录了学习郭林老师关于消息推送课程时的要点,特别是通过Mina框架实现服务器端的基础架构。Mina是一个轻量级的网络通信框架,广泛用于构建高性能、高可用性的网络应用程序,如消息推送...

    mina2推送demo服务端

    标题中的“mina2推送demo服务端”指的是使用Apache Mina框架构建的一个推送服务端的示例项目。Apache Mina是一个开源的Java网络应用框架,它简化了开发高性能和高可用性的网络服务器和客户端应用程序的工作。Mina...

    mina2推送demo客户端

    《MINA2推送Demo客户端详解及应用》 MINA(Multi-purpose Infrastructure for Network Applications)是一个高性能、异步的网络通信框架,由Apache软件基金会开发,主要用于构建网络应用程序,如TCP/IP和UDP/IP协议...

    mina及时推送客户端服务端实现

    1. **实时推送**:实时推送是现代应用中常见的一种需求,如消息通知、直播互动等。MINA可以通过TCP长连接来实现这一点,TCP是一种面向连接的、可靠的传输协议,适合用于需要持续交互的数据通信。 2. **长连接**:长...

    java开源实时消息推送系统.rar

    Java开源实时消息推送系统是一种基于Java技术构建的高效、可靠且可扩展的解决方案,用于在互联网应用程序中实现实时通信。这种系统通常采用发布/订阅模型,允许服务器将消息广播到多个客户端,确保数据的即时传输。...

    推送sdk (类似百度 推送 ) android mina (待优化... )

    http://knight-black-bob.iteye.com/blog/2370938 推送sdk (类似百度 推送 ) android mina (待优化... ) 本demo 研究的是原理,不要计较太多。。。。 至于token生成,service 保活,定时启动 不做说明。

    android消息推送(服务端+客户端)

    完整的android消息推送示例,该例子完善了androidpn开源项目,支持离线推送。androidpn基于Apache Mina开源框架,采用XMPP协议传输数据。 实例中,服务端支持weblogic跟tomcat应用服务器。

    若依集成CIM(即时推送系统)实现将服务端修改为SpringBoot+Vue前后端分离版代码.rar

    CIM是一套基于mina或netty框架下的推送系统,或许有一些企业有着自己一套即时通讯系统的需求,那么CIM为您提供了一个解决方案,目前CIM支持websocket,android,ios,桌面应用,系统应用等多端接入支持,可应用于移动...

    apache Mina和Flex as3.0 交互

    同样,Flex中的事件模型也允许用户在用户交互或其他系统事件发生时执行代码。 5. **安全性**:在Mina和Flex的交互中,安全也是一个重要的考虑因素。可以使用SSL/TLS来加密传输的数据,确保通信的安全性。此外,还...

    mina自定义编码器-固定位置指定消息的长度

    Apache MINA(Multi-purpose Infrastructure for Network Applications)是一个Java框架,用于构建高性能、高可用性的网络应用程序,例如服务器和客户端。MINA提供了高级网络通信抽象,包括异步I/O、事件驱动的架构...

    mina 1.17 精品源码 核心代码

    《MINA 1.17核心源码解析与应用实践》 MINA(Java Multithreaded Network Application Framework)是一个高性能、易用的Java网络应用框架,尤其在处理大规模并发连接时表现出色。MINA 1.17版本是其历史上的一个重要...

    mina 服务器socket客服端发消息

    1. **初始化ServerBootstrap**:首先,我们需要创建一个`ServerBootstrap`对象,它是Mina服务器的核心配置类。 2. **设置通道处理链**:通过`pipeline()`方法设置`ChannelPipeline`,它定义了事件的处理流程。一般会...

    Mina推送用到的jar包

    《Mina框架详解及其核心库解析》 Apache Mina是一个高度可扩展的网络通信框架,主要应用于开发高性能、高效率的服务器端应用。...在实际的推送服务中,Mina可以有效地处理大量并发连接,确保消息的快速、可靠传输。

    Android消息推送机制在分析交互系统中的应用.pdf

    文档中的实验结果表明,通过基于Apache Mina的推送方案设计的Web服务性能的移动分析系统具有良好的开放性和安全性,能有效降低移动应用开发者的开发周期。 ### 基金项目 该研究得到了国家自然科学基金资助项目的...

    基于Mina架构的移动数据Socket Server和android iOS Client端工程代码及文档

    基于Mina架构开发的可配置的Socket Server,后台采用MySql数据库,可以独立app部署或Tomcat Servlet部署,包括Socket Server全部实现代码,后台MySql数据备份文件,Java测试代码,android端测试代码和iOS端测试代码...

Global site tag (gtag.js) - Google Analytics