使用Apache MINA框架搭建服务端

使用MINA框架搭建服务端步骤:

1、定义一个启动服务的类MinaServer,并实现接口ServletContextListener

2、定义一个处理业务逻辑的类MinaServerHandler,并继承类IoHandlerAdapter

类MinaServer代码例如以下:

import java.net.InetSocketAddress;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import com.utils.LogUtil;

public class MinaServer implements ServletContextListener, HttpSessionListener {
	private static NioSocketAcceptor acceptor;
	private static final int port = 9999;
	private static final LogUtil logUtil = LogUtil.getLogUtil(MinaServer.class);

	// 停止MINA服务
	public void contextDestroyed(ServletContextEvent sce) {
		try {
			MinaServer.acceptor.unbind();
			MinaServer.acceptor.dispose();
			logUtil.customLog("Mina服务停止...");
		} catch (Exception e) {
			logUtil.customLog(e);
		}
	}

	// 启动MINA服务
	public void contextInitialized(ServletContextEvent sce) {
		try {
			// 创建一个非堵塞的server端的Socket
			acceptor = new NioSocketAcceptor();
			// 设置过滤器
			acceptor.getFilterChain().addLast(
					"serverCodec",
					new ProtocolCodecFilter(
							new ObjectSerializationCodecFactory()));
			acceptor.getFilterChain().addLast("ServerFilter",
					new ExecutorFilter());
			// 设置读取数据的缓冲区大小
			acceptor.getSessionConfig().setReadBufferSize(1024*102400);
			// 读写通道10秒内无操作进入空暇状态
			acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
			// 加入逻辑处理器
			acceptor.setHandler(new MinaServerHandler());
			// 绑定端口
			try {
				acceptor.bind(new InetSocketAddress(port));
			} catch (Exception e) {
			}
			logUtil.customLog("服务端启动成功...     端口号为:" + port);
		} catch (Exception e) {
			logUtil.customLog("服务端启动异常....");
		}

	}

	public void sessionCreated(HttpSessionEvent arg0) {
	}

	public void sessionDestroyed(HttpSessionEvent arg0) {
	}

}

类MinaServerHandler代码例如以下:

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

import com.model.DeliverObject;
import com.model.Orders;
import com.model.Users;
import com.service.GoodsService;
import com.service.OrdersService;
import com.service.UserService;
import com.utils.GetBeanUtil;
import com.utils.LogUtil;
import com.utils.Params;

public class MinaServerHandler extends IoHandlerAdapter {

	private static final LogUtil logUtil = LogUtil
			.getLogUtil(MinaServerHandler.class);

	@Override
	public void sessionCreated(IoSession session) throws Exception {
		logUtil.customLog("服务端与client创建连接...");
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		logUtil.customLog("服务端与client连接打开...");
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {

		DeliverObject recvObj = (DeliverObject) message;
		int optionType = recvObj.getOptionType();
		// 假设是登录操作
		if (optionType == Params.LOGIN) {
			UserService userService = (UserService) GetBeanUtil
					.getBean("userService");
			userService.doLogin(session, (Users) recvObj.getObj());
		} else if (optionType == Params.REGISTER) {
			// 假设是注冊操作
			UserService userService = (UserService) GetBeanUtil
					.getBean("userService");
			userService.doRegister(session, (Users) recvObj.getObj());
		} else if (optionType == Params.UPDATEUSER) {
			// 假设是改动用户信息操作
			UserService userService = (UserService) GetBeanUtil
					.getBean("userService");
			userService.doUpdateUser(session, (Users) recvObj.getObj());
		} else if (optionType == Params.SEARCHGOODS) {
			// 假设是搜索商品操作
			GoodsService goodsService = (GoodsService) GetBeanUtil
					.getBean("goodsService");
			goodsService.doSearchGoods(session, (String) recvObj.getObj());
		} else if (optionType == Params.SUBMITORDERS) {
			// 假设是提交订单操作
			OrdersService ordersService = (OrdersService) GetBeanUtil
					.getBean("ordersService");
			ordersService.doSubmitOrders(session, (Orders) recvObj.getObj());
		} else if (optionType == Params.SEARCHALLORDERS) {
			// 假设是查询全部订单操作
			OrdersService ordersService = (OrdersService) GetBeanUtil
					.getBean("ordersService");
			ordersService.doSearchAllOrders(session, (Users) recvObj.getObj());
		}

	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		logUtil.customLog("服务端发送信息成功...");
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		logUtil.customLog("服务端与client连接关闭...");
		session.close(true);
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status)
			throws Exception {
		super.sessionIdle(session, status);
		logUtil.customLog("服务端进入空暇状态...");
	}

	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		logUtil.customLog("服务端发送异常..." + cause);
		session.close(true);
	}

}
时间: 2024-08-02 21:29:07

使用Apache MINA框架搭建服务端的相关文章

Apache MINA框架整合到Spring框架中

毕业设计用到了Apache公司的MINA框架作为服务端与安卓客户端的通信框架. 问题:服务端分为两个部分,一个是基于javaEE平台的后台管理系统,另一个是基于MINA框架的服务,整个项目中需求是当tomcat服务器启动的时候,将MINA服务也一起启动起来,相当于服务端程序运行起来后,开启两个服务. 分析:服务端的后台管理系统是采用Spring+Hibernate框架整合搭建的,而当tomcat服务器启动后,会加载spring的配置文件,而spring配置文件中可以自定义监听器,将启动MINA服

Apache Mina框架实践

1.为什么要用Apache Mina框架 ApacheMina Server 是一个网络通信应用框架,Mina 可以帮助我们快速开发高性能.高扩展性的网络通信应用,Mina 提供了事件驱动.异步(Mina 的异步IO 默认使用的是JAVANIO 作为底层支持)操作的编程模型. 2.ApacheMina框架使用 Mina的执行流程: > IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立. > IoProcessor:这个接口在另一个线程上

Apache Mina框架自身实现的过滤器

在Apache Mina中,IoFilter介于IoService和IoHanlder之间,该IO过滤器对所有的输入.输出事件进行过滤,其在Apache Mina中的地位不可忽视,Apache Mina框架自身实现了很多过滤器,现将其作用总结一下: 1.BlacklistFilter:该过滤器称为黑名单过滤器,该过滤器用于阻止特定IP地址的访问Apache Mina服务端.其使用方法如下: private void addFilter(IoAcceptor acceptor) throws Un

Mina airQQ聊天 服务端篇(二)

Mina聊天服务端实现思路:在用户登录的时候.连接服务端而且验证登录用户,假设成功,则将IoSession保存到map<账号,IoSession>中,而且通知该用户的好友上线,然 后再请求好友列表:若不成功,则断开连接. 自己定义协议格式:包头+包体 包头(10字节):包头长度(short)+ 消息类型(byte)+ 内容类型(byte) +  消息命令(short)+ 包体长度(int) 包体:JSON字符串 自己定义编码解码:因为数据在网络传输过程中都是以二进制传输的,所以我们能够自己定义

使用Apache CXF开发WebServices服务端、客户端

在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apache的官网,可以看到xfire已经被合并了. 最新的框架叫做CXF. Apache CXF = Celtix + XFire. CXF 继承了 Celtix 和 XFire 两大开源项目的精华, 提供了对 JAX-WS 全面的支持,并且提供了多种 Binding .DataBinding.Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code Fi

ABP开发框架前后端开发系列---(15)ABP框架的服务端和客户端缓存的使用

缓存在一个大型一点的系统里面是必然会涉及到的,合理的使用缓存能够给我们的系统带来更高的响应速度.由于数据提供服务涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器无法快速处理这些并发请求,那么将会增加客户端的请求时间,严重者可能导致数据库服务或者应用服务直接瘫痪.缓存方案就是为这个而诞生,随着缓存的引入,可以把数据库的IO耗时操作,转换为内存数据的快速响应操作,或者把整个页面缓存到缓存系统里面.本篇随笔主要介绍利用ABP框架的支持实现

RPC框架 - thrift 服务端

-------服务端程序 ------ 下载    下载 thrift 源代码包    下载 thrift 的bin包 准备描述文件(使用源代码包的示例文件)    \thrift-0.10.0\tutorial\shared.thrift    \thrift-0.10.0\tutorial\tutorial.thrift 根据描述文件生成代码    thrift-0.10.0.exe -r -o lib_server --gen php:server idl-dir/tutorial.thr

CAS 5.1.X 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明

这节主要解释一下上一节剩余的一些配置是做什么的,为了阅读方便直接在配置文件中写注释 #STEP 3 在TOMCAT8.5中跑一个模板然后将其war包中解压出来的的application.properties复制出来,放到手动创建的src下的resources里面 ## # CAS Server Context Configuration # server.context-path=/cas server.port=8443 #STEP 5添加认证服务 ①---------------------

spring boot 集成 Apache CXF 调用 .NET 服务端 WebService

1. pom.xml加入 cxf 的依赖 <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>2.7.18&l