黑马程序员技术交流社区

标题: 使用Apache MINA框架搭建服务端 [打印本页]

作者: yangcy    时间: 2014-7-10 13:11
标题: 使用Apache MINA框架搭建服务端
本帖最后由 yangcy 于 2014-7-10 13:14 编辑

使用MINA框架搭建服务端步骤:
1、定义一个启动服务的类MinaServer,并实现接口ServletContextListener
2、定义一个处理业务逻辑的类MinaServerHandler,并继承类IoHandlerAdapter
类MinaServer代码如下:
  1. import java.net.InetSocketAddress;

  2. import javax.servlet.ServletContextEvent;
  3. import javax.servlet.ServletContextListener;
  4. import javax.servlet.http.HttpSessionEvent;
  5. import javax.servlet.http.HttpSessionListener;

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

  11. import com.utils.LogUtil;

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


  16.         // 停止MINA服务
  17.         public void contextDestroyed(ServletContextEvent sce) {
  18.                 try {
  19.                         MinaServer.acceptor.unbind();
  20.                         MinaServer.acceptor.dispose();
  21.                         logUtil.customLog("Mina服务停止...");
  22.                 } catch (Exception e) {
  23.                         logUtil.customLog(e);
  24.                 }
  25.         }

  26.         // 启动MINA服务
  27.         public void contextInitialized(ServletContextEvent sce) {
  28.                 try {
  29.                         // 创建一个非阻塞的server端的Socket
  30.                         acceptor = new NioSocketAcceptor();
  31.                         // 设置过滤器
  32.                         acceptor.getFilterChain().addLast(
  33.                                         "serverCodec",
  34.                                         new ProtocolCodecFilter(
  35.                                                         new ObjectSerializationCodecFactory()));
  36.                         acceptor.getFilterChain().addLast("ServerFilter",
  37.                                         new ExecutorFilter());
  38.                         // 设置读取数据的缓冲区大小
  39.                         acceptor.getSessionConfig().setReadBufferSize(1024*102400);
  40.                         // 读写通道10秒内无操作进入空闲状态
  41.                         acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
  42.                         // 添加逻辑处理器
  43.                         acceptor.setHandler(new MinaServerHandler());
  44.                         // 绑定端口
  45.                         try {
  46.                                 acceptor.bind(new InetSocketAddress(port));
  47.                         } catch (Exception e) {
  48.                         }
  49.                         logUtil.customLog("服务端启动成功...     端口号为:" + port);
  50.                 } catch (Exception e) {
  51.                         logUtil.customLog("服务端启动异常....");
  52.                 }

  53.         }

  54.         public void sessionCreated(HttpSessionEvent arg0) {
  55.         }

  56.         public void sessionDestroyed(HttpSessionEvent arg0) {
  57.         }

  58. }
复制代码


类MinaServerHandler代码如下:
  1. import org.apache.mina.core.service.IoHandlerAdapter;
  2. import org.apache.mina.core.session.IdleStatus;
  3. import org.apache.mina.core.session.IoSession;

  4. import com.model.DeliverObject;
  5. import com.model.Orders;
  6. import com.model.Users;
  7. import com.service.GoodsService;
  8. import com.service.OrdersService;
  9. import com.service.UserService;
  10. import com.utils.GetBeanUtil;
  11. import com.utils.LogUtil;
  12. import com.utils.Params;

  13. public class MinaServerHandler extends IoHandlerAdapter {

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

  16.         @Override
  17.         public void sessionCreated(IoSession session) throws Exception {
  18.                 logUtil.customLog("服务端与客户端创建连接...");
  19.         }

  20.         @Override
  21.         public void sessionOpened(IoSession session) throws Exception {
  22.                 logUtil.customLog("服务端与客户端连接打开...");
  23.         }

  24.         @Override
  25.         public void messageReceived(IoSession session, Object message)
  26.                         throws Exception {

  27.                 DeliverObject recvObj = (DeliverObject) message;
  28.                 int optionType = recvObj.getOptionType();
  29.                 // 如果是登录操作
  30.                 if (optionType == Params.LOGIN) {
  31.                         UserService userService = (UserService) GetBeanUtil
  32.                                         .getBean("userService");
  33.                         userService.doLogin(session, (Users) recvObj.getObj());
  34.                 } else if (optionType == Params.REGISTER) {
  35.                         // 如果是注册操作
  36.                         UserService userService = (UserService) GetBeanUtil
  37.                                         .getBean("userService");
  38.                         userService.doRegister(session, (Users) recvObj.getObj());
  39.                 } else if (optionType == Params.UPDATEUSER) {
  40.                         // 如果是修改用户信息操作
  41.                         UserService userService = (UserService) GetBeanUtil
  42.                                         .getBean("userService");
  43.                         userService.doUpdateUser(session, (Users) recvObj.getObj());
  44.                 } else if (optionType == Params.SEARCHGOODS) {
  45.                         // 如果是搜索商品操作
  46.                         GoodsService goodsService = (GoodsService) GetBeanUtil
  47.                                         .getBean("goodsService");
  48.                         goodsService.doSearchGoods(session, (String) recvObj.getObj());
  49.                 } else if (optionType == Params.SUBMITORDERS) {
  50.                         // 如果是提交订单操作
  51.                         OrdersService ordersService = (OrdersService) GetBeanUtil
  52.                                         .getBean("ordersService");
  53.                         ordersService.doSubmitOrders(session, (Orders) recvObj.getObj());
  54.                 } else if (optionType == Params.SEARCHALLORDERS) {
  55.                         // 如果是查询所有订单操作
  56.                         OrdersService ordersService = (OrdersService) GetBeanUtil
  57.                                         .getBean("ordersService");
  58.                         ordersService.doSearchAllOrders(session, (Users) recvObj.getObj());
  59.                 }

  60.         }

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

  65.         @Override
  66.         public void sessionClosed(IoSession session) throws Exception {
  67.                 logUtil.customLog("服务端与客户端连接关闭...");
  68.                 session.close(true);
  69.         }

  70.         @Override
  71.         public void sessionIdle(IoSession session, IdleStatus status)
  72.                         throws Exception {
  73.                 super.sessionIdle(session, status);
  74.                 logUtil.customLog("服务端进入空闲状态...");
  75.         }

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

  82. }
复制代码








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2