使用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);
} }
使用Apache MINA框架搭建服务端的更多相关文章
- mina框架之---服务端NioSocketAcceptor的学习
		接上一讲对mina的简单应用和对mina服务端和客户端中几个重要的技术知识点的理解后,今天着重对mina服务端的NioSocketAcceptor 进行学习. 说这个玩意之前,先整体上看一下在mina ... 
- express框架搭建服务端
		1.管理员权限全局安装express npm i -g express-generator@4 2.创建express项目 express -e projectName 3.进入项目并安装 cd pr ... 
- CAS 5.1.x  的搭建和使用(一)—— 通过Overlay搭建服务端
		CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ... 
- CAS 5.1.x  的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明
		CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ... 
- 用“MEAN”技术栈开发web应用(二)express搭建服务端框架
		上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在nodejs环境下利用express来 ... 
- Netty搭建服务端的简单应用
		Netty简介 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客 ... 
- 使用Apache CXF开发WebServices服务端、客户端
		在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apache的官网,可以看到xfire已经被合并了. 最新的框架叫做CXF. Apache CXF = C ... 
- Mina airQQ聊天 服务端篇(二)
		Mina聊天服务端实现思路:在用户登录的时候.连接服务端而且验证登录用户,假设成功,则将IoSession保存到map<账号,IoSession>中,而且通知该用户的好友上线,然 后再请求 ... 
- .Net Mvc3框架调用服务端控件解决方案
		/*BY:Wangyexin date:2011年4月30日 20:17:38*/ /*说明:.net mvc3框架,View层调用服务端控件,输出到.cshtml文件中显示*/ 1.先说说.ne ... 
随机推荐
- Arduino可穿戴开发入门教程Arduino开发环境介绍
			Arduino可穿戴开发入门教程Arduino开发环境介绍 Arduino开发环境介绍 Arduino不像我们使用的PC端操作系统一样,可以直接在操作系统中安装软件为操作系统编程.Arduino的软件 ... 
- ARC 080 - C 4-adjacent
			题面在这里! 把每个数替换成它在2上的指数,然后发现0只能和>=2的相邻,所以手玩一下就好啦. #include<bits/stdc++.h> #define ll long lon ... 
- 【Splay】【启发式合并】hdu6133 Army Formations
			题意:给你一颗树,每个结点的儿子数不超过2.每个结点有一个权值,一个结点的代价被定义为将其子树中所有结点的权值放入数组排序后,每个权值乘以其下标的和.让你计算所有结点的代价. 二叉树的条件没有用到. ... 
- 【枚举】【SPFA】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem I. Iron and Coal
			那个人派出的队伍的行走的路径一定前半程是重合的,后半程分叉开来. 于是预处理每个点离1号点的最短路,到最近的铁的最短路,到最近的煤的最短路.(三次BFS / SPFA)然后枚举分岔点,尝试更新答案即可 ... 
- python基础之闭包函数与装饰器
			闭包函数: 什么是闭包函数: 闭指的是定义在一个函数内部 包指的是该函数包含对外部作用域(非全局作用域)名字的引用 def counter(): n=0 def incr(): nonlocal n ... 
- Java学习笔记(12)
			eclipse使用的步骤: 1.选择工作目录.以后在Eclipse上面写的所有代码都是在工作目录上的 2.在Project Exploer窗口上新建一个工程,以后我们写代码都是以工程为单位的 3.在工 ... 
- ES6的let和const命令
			刚开始学习es6,心里有点方,因为看了前言,感觉要用什么bebal来翻译成es5的代码,才能在各个平台上兼容运行,还有node各种运行环境. 不过自己也去百度了一些,发现还是有一丢丢的困难. 言归正传 ... 
- Web安全开发指南--异常错误处理与日志审计
			1.异常错误处理与日志审计 5.1.日志审计系统安全规则 1 日志系统能够记录特定事件的执行结果(比如 成功或失败). 确保日志系统包含如下重要日志信息: 1. 日志发生的时间: 2. 事件的严重 ... 
- Delphi Xe10
			http://blog.csdn.net/tht2009/article/details/48165371 
- error C2248: 'MyString::pCharArray' : cannot access private member declared in class 'MyString'
			std::ostream & operator<<(std::ostream os,const MyString & mystr){os<<mystr.pCha ... 
