使用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框架搭建服务端的更多相关文章

  1. mina框架之---服务端NioSocketAcceptor的学习

    接上一讲对mina的简单应用和对mina服务端和客户端中几个重要的技术知识点的理解后,今天着重对mina服务端的NioSocketAcceptor 进行学习. 说这个玩意之前,先整体上看一下在mina ...

  2. express框架搭建服务端

    1.管理员权限全局安装express npm i -g express-generator@4 2.创建express项目 express -e projectName 3.进入项目并安装 cd pr ...

  3. CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端

    CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ...

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

    CAS单点登录系列: CAS 5.1.x 的搭建和使用(一)—— 通过Overlay搭建服务端 CAS5.1.x 的搭建和使用(二)—— 通过Overlay搭建服务端-其它配置说明 CAS5.1.x ...

  5. 用“MEAN”技术栈开发web应用(二)express搭建服务端框架

    上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在nodejs环境下利用express来 ...

  6. Netty搭建服务端的简单应用

    Netty简介 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客 ...

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

    在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apache的官网,可以看到xfire已经被合并了. 最新的框架叫做CXF. Apache CXF = C ...

  8. Mina airQQ聊天 服务端篇(二)

    Mina聊天服务端实现思路:在用户登录的时候.连接服务端而且验证登录用户,假设成功,则将IoSession保存到map<账号,IoSession>中,而且通知该用户的好友上线,然 后再请求 ...

  9. .Net Mvc3框架调用服务端控件解决方案

      /*BY:Wangyexin date:2011年4月30日 20:17:38*/ /*说明:.net mvc3框架,View层调用服务端控件,输出到.cshtml文件中显示*/ 1.先说说.ne ...

随机推荐

  1. Python开发基础-Day4-布尔运算、集合

    布尔值 True 真 False 假 所有的数据类型都自带布尔值,数据只有在0,None和空的时候为False. print(bool()) print(bool()) print(bool('')) ...

  2. [BZOJ2337][HNOI2011]XOR和路径(概率+高斯消元)

    直接不容易算,考虑拆成位处理. 设f[i]表示i到n的期望路径异或和(仅考虑某一位),则$f[y]=\sum\limits_{exist\ x1\to y=0}\frac{f[x1]}{d[x1]}+ ...

  3. ARC 080 - C 4-adjacent

    题面在这里! 把每个数替换成它在2上的指数,然后发现0只能和>=2的相邻,所以手玩一下就好啦. #include<bits/stdc++.h> #define ll long lon ...

  4. 【扩展欧几里得】Codeforces Round #406 (Div. 2) A. The Monster

    扩欧,a+bx=c+dx,输出x>=0且y>=0,且a+bx最小的解. 要注意不能只保证x非负,还得看看能否保证y也非负. #include<cstdio> #include& ...

  5. 【DFS】bzoj2435 [Noi2011]道路修建

    两遍DFS.第一遍统计以每个点为根的子树大小,第二遍更新答案. #include<cstdio> #include<iostream> using namespace std; ...

  6. 微信小程序-微信自动退款(Java后台)

    微信小程序-微信自动退款 1.首先分享 微信自动退款接口: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4 微信付款 代码案例 ...

  7. Problem I: 零起点学算法88——青年歌手大奖赛_评委会打分

    #include<stdio.h> int main(void) { ],n,i; while(scanf("%d",&n)!=EOF) { n>& ...

  8. 【MySQL笔记】用户管理

    1.账户管理 1.1登录和退出MySQL服务器 MySQL –hhostname|hostIP –P port –u username –p[password] databaseName –e &qu ...

  9. Ubuntu 16.04下没有/var/log/messages文件问题解决

    1.问题描述 今天需要查看Ubuntu系统的日志文件,但却没有找到/var/log/messages这个文件.网上搜素资料,说是要配置/etc/syslog.conf.syslog采用可配置的.统一的 ...

  10. 高并发环境下,Redisson实现redis分布式锁

    原文:http://tlzl0526-gmail-com.iteye.com/blog/2378853 在一些高并发的场景中,比如秒杀,抢票,抢购这些场景,都存在对核心资源,商品库存的争夺,控制不好, ...