1. 介绍概念

2. 环境的搭建

3. 一个hello world 的demo。

4. 框架的解析

一.什么是MINA

首先,Mina(Multipurpose Infrastructure Networked Applications)是Apache开源组织下的一个高性能的网络应用框架,它可以帮助用户开发高性能和高扩展性的网络应用程序,它提供了一个抽象的、事件驱动的异步API,使得Java NIO(非阻塞式)在各种传输协议下快速高效开发。

总之:我们简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!

二.环境的搭建

第一步:导入jar包

第二步:日志文件的配置

创建一个java project ,添加配置文件 log4j.properties

log4j.rootLogger=DEBUG,MINA,file

log4j.appender.MINA=org.apache.log4j.ConsoleAppender

log4j.appender.MINA.layout=org.apache.log4j.PatternLayout

log4j.appender.MINA.layout.ConversionPattern=%d{yyyy-MM-ddHH\:mm\:ss,SSS}%-5p%c{1}%x-%m%n

log4j.appender.file=org.apache.log4j.RollingFileAppender

log4j.appender.file.File=./log/minademos.log

log4j.appender.file.MaxFileSize=5120KB

log4j.appender.file.MaxBackupIndex=10

log4j.appender.file.layout=org.apache.log4j.PatternLayout

log4j.appender.file.layout.ConversionPattern=[VAMS][%d]%p|%m|[%t]%C.%M(%L)%n

第三步:开始Hello World 的小Demo

第一个小例子:

服务端:

Demo1Server.java

package com.bjsxt.mina.server;

 

import java.net.InetSocketAddress;

import java.nio.charset.Charset;

 

import org.apache.log4j.Logger;

import org.apache.mina.common.IdleStatus;

import org.apache.mina.common.IoAcceptor;

import org.apache.mina.filter.codec.ProtocolCodecFilter;

import org.apache.mina.filter.codec.textline.LineDelimiter;

import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

 

import com.bjsxt.mina.handler.Demo1ServerHandler;

 

/**

 *

 * 创建服务端最主要的就是绑定服务端的消息编码解码过滤器和业务逻辑处理器;

 * @author Administrator

 *

 */

public class Demo1Server {

   private static Logger logger =Logger.getLogger(Demo1Server.class);

 

   private static int PORT = 3005;

 

   public static void main(String[]args) {

      IoAcceptor acceptor = null; // 创建连接

      try {

        // 创建一个非阻塞的server端的Socket

        acceptor = newNioSocketAcceptor();

        // 设置过滤器(使用Mina提供的文本换行符编解码器)

        acceptor.getFilterChain().addLast(

              // 添加消息过滤器

              "codec",

              newProtocolCodecFilter(new TextLineCodecFactory(Charset

                    .forName("UTF-8"),

                    LineDelimiter.WINDOWS.getValue(),

                    LineDelimiter.WINDOWS.getValue())));

        // 设置读取数据的缓冲区大小

        acceptor.getSessionConfig().setReadBufferSize(2048);

        // 读写通道10秒内无操作进入空闲状态

        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);

        // 绑定逻辑处理器

        acceptor.setHandler(newDemo1ServerHandler()); // 添加业务处理

        // 绑定端口

        acceptor.bind(newInetSocketAddress(PORT));

        logger.info("服务端启动成功...     端口号为:" + PORT);

      } catch (Exception e) {

        logger.error("服务端启动异常....", e);

        e.printStackTrace();

      }

   }

 

}

 

 

 

 

 

 

 

Demo1ServerHandler.java

package com.bjsxt.mina.handler;

 

import java.util.Date;

 

import org.apache.log4j.Logger;

import org.apache.mina.common.IdleStatus;

import org.apache.mina.common.IoHandlerAdapter;

import org.apache.mina.common.IoSession;

 

public class Demo1ServerHandler extends IoHandlerAdapter {

   public static Logger logger =Logger.getLogger(Demo1ServerHandler.class);

 

   @Override

   public voidsessionCreated(IoSession session) throws Exception {

      logger.info("服务端与客户端创建连接...");

   }

 

   @Override

   public voidsessionOpened(IoSession session) throws Exception {

      logger.info("服务端与客户端连接打开...");

   }

 

   @Override

   public voidmessageReceived(IoSession session, Object message)

        throws Exception {

      String msg =message.toString();

      logger.info("服务端接收到的数据为:" + msg);

      if("bye".equals(msg)) { // 服务端断开连接的条件

        session.close();

      }

      Date date = new Date();

      session.write(date);

   }

 

   @Override

   public void messageSent(IoSessionsession, Object message) throws Exception {

      session.close();

      logger.info("服务端发送信息成功...");

   }

 

   @Override

   public voidsessionClosed(IoSession session) throws Exception {

 

   }

 

   @Override

   public void sessionIdle(IoSessionsession, IdleStatus status)

        throws Exception {

      logger.info("服务端进入空闲状态...");

   }

 

   @Override

   public voidexceptionCaught(IoSession session, Throwable cause)

        throws Exception {

      logger.error("服务端发送异常...", cause);

   }

 

}

 

 

注意:创建服务端最主要的就是绑定服务端的消息编码解码过滤器和业务逻辑处理器;

业务逻辑处理器是Demo1ServerHandler

测试第一个小例子。。。。

Mina的底层通信无疑是用socket实现的,它封装后提供给我们一个简单易用的接口。

例子二:

模拟手机的短信的发送

package com.bjsxt.mina.server;

import java.net.InetSocketAddress;

import java.nio.charset.Charset;

import org.apache.log4j.Logger;

import org.apache.mina.common.IdleStatus;

import org.apache.mina.common.IoAcceptor;

import org.apache.mina.common.IoSessionConfig;

importorg.apache.mina.filter.codec.ProtocolCodecFilter;

importorg.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;

importorg.apache.mina.filter.codec.textline.LineDelimiter;

importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;

importorg.apache.mina.transport.socket.nio.NioSocketAcceptor;

importcom.bjsxt.mina.handler.ShortMsgServerHandler;

/**

*@author Administrator--jiangyu--2014-9-11下午8:17:14

* 服务器端

*/

public class ShortMsgServer {

privatestatic Logger logger = Logger.getLogger(ShortMsgServer.class);

privatestatic int PORT = 3006;

publicstatic void main(String[] args) {

IoAcceptoracceptor = null;

try{

//创建一个非阻塞的server端的Socket

//         acceptor  = new NioDatagramAcceptor();

acceptor  = new NioSocketAcceptor();

//直接发送对象信息

acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(

newTextLineCodecFactory(Charset

.forName("UTF-8"),LineDelimiter.WINDOWS.getValue(),

LineDelimiter.WINDOWS.getValue())));

//获得IosessionConfig对象

IoSessionConfigcfg = acceptor.getSessionConfig();

//读写通道10秒内没有操作就进入空闲状态

cfg.setIdleTime(IdleStatus.BOTH_IDLE,100);

//绑定逻辑处理器

acceptor.setHandler(newShortMsgServerHandler());

//绑定短端口号

acceptor.bind(newInetSocketAddress(PORT));

logger.info("服务端启动成功。。。 端口号为:"+PORT);

}catch (Exception e) {

logger.error("服务端启动异常。。。",e);

e.printStackTrace();

}

}

}

package com.bjsxt.mina.handler;

import org.apache.log4j.Logger;

importorg.apache.mina.common.IoHandlerAdapter;

import org.apache.mina.common.IoSession;

/**

*

* 服务端业务逻辑处理

*@author Administrator--jiangyu--2014-9-11下午8:17:05

*

*/

public class ShortMsgServerHandler extendsIoHandlerAdapter{

publicstatic Logger logger = Logger.getLogger(ShortMsgServerHandler.class);

@Override

publicvoid messageReceived(IoSession session, Object message) throws Exception {

StringphoneMes = message.toString();

String[]megs = phoneMes.split(";");

StringsendPhone = megs[0];

StringreceivePhone = megs[1];

Stringmes = megs[2];

logger.info("发送人的手机号码:"+sendPhone);

logger.info("接收人的手机号码:"+receivePhone);

logger.info("发送消息为:"+mes);

//短信信息存入移动服务端数据库或者写入手机短信转发队列

session.write("发送成功");

}

@Override

publicvoid messageSent(IoSession session, Object message) throws Exception {

//发送成功后主动断开与客户端的连接

session.close();

}

@Override

publicvoid exceptionCaught(IoSession session, Throwable cause)

throwsException {

logger.error("服务端发送异常...", cause);

}

}

package com.bjsxt.mina.client;

import java.net.InetSocketAddress;

import java.nio.charset.Charset;

import org.apache.log4j.Logger;

import org.apache.mina.common.ConnectFuture;

import org.apache.mina.common.IoConnector;

import org.apache.mina.common.IoSession;

importorg.apache.mina.filter.codec.ProtocolCodecFilter;

importorg.apache.mina.filter.codec.textline.LineDelimiter;

importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;

import org.apache.mina.transport.socket.nio.NioSocketConnector;

importcom.bjsxt.mina.handler.ShortMsgClientHandler;

/**

*@author Administrator--jiangyu--2014-9-11下午8:17:01

* 客户端

*/

public class ShortMsgClient {

privatestatic Logger logger = Logger.getLogger(ShortMsgClient.class);

privatestatic String HOST = "127.0.0.1";

privatestatic int PORT = 3006;

publicstatic void main(String[] args) {

//创建一个非阻塞式的客户端程序

IoConnectorconnector = new NioSocketConnector();

//设置连接超时时间

connector.setConnectTimeout(30000);

//设置过滤器

connector.getFilterChain().addLast("codec",newProtocolCodecFilter(

newTextLineCodecFactory(Charset.forName("UTF-8"),

LineDelimiter.WINDOWS.getValue(),

LineDelimiter.WINDOWS.getValue())));

//添加业务逻辑处理类

connector.setHandler(newShortMsgClientHandler());

IoSessionsession = null;

try{

//创建连接

ConnectFuturefuture = connector.connect(

newInetSocketAddress(HOST, PORT));

//等待连接创建完成

future.awaitUninterruptibly();

//获得session

session= future.getSession();

//PhotoMsgDtosendMes =

//set

//发送人的手机号码

StringsendPhone = "13681803609";

//接受人的手机号码

StringreceivePhone = "13721427169";

//发送的消息

Stringmessage = "Hello world!!";

Stringmsg = sendPhone + ";" + receivePhone + ";" + message;

session.write(msg);

}catch (Exception e) {

logger.error("客户端连接异常...", e);

}

}

}

package com.bjsxt.mina.handler;

import org.apache.log4j.Logger;

importorg.apache.mina.common.IoHandlerAdapter;

import org.apache.mina.common.IoSession;

/**

* 客户端业务逻辑处理

* @authorAdministrator--jiangyu--2014-9-11 下午8:16:46

*  业务逻辑处理类,这个是重点!业务很简单,如果服务器接收信息成功,就返回接收信息成功的信息。在今后用mina写应用程序时,它是重点之一。

*

*/

public class ShortMsgClientHandler extendsIoHandlerAdapter {

privatestatic Logger logger = Logger

.getLogger(ShortMsgClientHandler.class);

@Override

publicvoid messageReceived(IoSession session, Object message)

throwsException {

Stringmsg = message.toString();

logger.info("客户端接收到的信息为:" + msg);

}

@Override

publicvoid exceptionCaught(IoSession session, Throwable cause)

throwsException {

logger.error("客户端发生异常...", cause);

}

}

服务端程序或客户端程序创建过程:

创建连接---添加消息过滤器(编码解码等)——>添加业务处理

直接发送一个java对象 new ObjectSerializationCodecFactory()  使用dto

总结:

通过上面的练习,基本可以使用Mina开发小的应用程序啦。

下面就总结一下:

首先,看Mina在项目中所处的位置,如下图:

Mina处于中间层,它不关心底层网络数据如何传输,只负责接收底层数据,过滤并转换为Java对象提供给我们的应用程序,然后把应用程序响应值过滤并转换为底层识别的字节,提供给底层传输;

------总之:Mina是底层数据传输和用户应用程序交互的接口!

Mina工作流程图如下:

这个流程图不仅很直观的看出了Mina的工作流程,也涵盖了Mina的三个核心接口:IoService接口,IoFilter接口和IoHandler接口:

l 第一步. 创建服务对象(客户端或服务端)  ---IoService接口实现

l 第二步. 数据过滤(编码解码等)     ---IOFilter接口实现

l 第三步. 业务处理                        ---IoHandler接口实现

Mina的精髓是IOFilter,它可以进行日志记录,信息过滤,编码解码等操作,把数据接收发送从业务层独立出来。创建服务对象,则是把NIO繁琐的部分进行封装,提供简洁的接口。业务处理是我们最关心的部分,跟普通的应用程序没任何分别。

Socket编程俗称Java网络编程,是JavaWeb开发的精髓!做J2EE的人可能很少关心多线程,NIO等等这些东西,但是不可否认它却实时与我们打交道,比如常用的web容器Tomcat。

 

Mina的入门(一)相关推荐

  1. mina框架入门(简单客户端和服务端实例)

    学习资料来自:守望者 Mina 是apche开发的一个开源的网络通信框架,基于JavaNIO来实现 需要用到的jar包如下:可自行到官网下载mina Apache官网 案例:入门服务端程序 写一个服务 ...

  2. php 客户端 mina,Apache Mina快速入门

    Mina是什么 Mina是一个基于NIO的网络框架,使用它编写程序时,可以专注于业务处理,而不用过于关心IO操作.不论应用程序采用什么协议(TCP.UDP)或者其它的,Mina提供了一套公用的接口,来 ...

  3. java mina spring_Mina入门教程(二)----Spring4 集成Mina

    在spring和mina集成的时候,要十分注意一个问题:版本. 这是一个非常严重的问题,mina官网的demo没错,网上很多网友总结的代码也是对的,但是很多人将mina集成到spring中的时候,总是 ...

  4. 使用 Apache MINA 开发高性能网络应用程序

    http://www.ibm.com/developerworks/cn/opensource/os-cn-apmina/ Apache MINA(Multipurpose Infrastructur ...

  5. mina java c_Mina简介

    Mina简介 Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和 ...

  6. Apache Mina实例

    Apache MINA(Multipurpose Infrastructure for Network Applications) 官网http://mina.apache.org/ 是 Apache ...

  7. Mina快速编码测试验证示例

    此文借鉴于Apache Mina 官网,Apache Mina快速入门指南(Quick start guide) NIO服务端接收器 package com.boonya.mina.quickstar ...

  8. YL工作记录 (不断更新) -- 2020.04

    -------------------- 2020.04.07-2020.04.17 -------------------- 1. @XStreamAlias理解和使用 - XStream 是个很强 ...

  9. Apache MINA框架快速入门

    一.为什么要用MINA框架 Apache Mina是一个网络通信应用框架,是基于TCP/IP.UDP/IP协议栈的通信框架,Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持,具有高性能 ...

  10. mina简单实用_Mina入门实例(一)

    mina现在用的很多了,之前也有用到,但是毕竟不熟悉,于是查了一些资料,做了一些总结.看代码是最直观的,比什么长篇大论都要好.不过其中重要的理论,也要理解下. 首先是环境,程序运行需要几个包,这里用m ...

最新文章

  1. MySQL检查冗余索引代码
  2. python快速入门答案-Python 开发 14 天快速入门
  3. 密码学在区块链隐私保护中的应用学习
  4. open函数返回-1_4.6 linux的系统调用执行探究(1)
  5. vue 随机显示数组的其中一个_两个显示器组建双屏其中一个屏幕出现重影解决方法...
  6. 人人,金山西山居,腾讯互娱,微信,网易游戏offer及面经
  7. 群晖J3455安装DS3617xs 6.2.3折腾教程
  8. AutoCAD DWG 读模块参数:处理块
  9. 使用python合并多个pdf文件
  10. java 掩码 iP与位数的转化
  11. SAP-MM移动类型
  12. QQ邮箱客户端授权码设置
  13. css app菜单,简单的Material Design风格手机App菜单特效
  14. CentOS 7找回root密码
  15. mysql 季度统计_mysql 按年度、季度、月度、周、日SQL统计查询
  16. js正则验证身份证号码(最后一位x不区分大小写)
  17. Linux--进程(一篇博客让你理解操作系统的底层)
  18. web前端——div和span标签
  19. 20220417在WIN10下给串口板FT232RL装驱动的步骤
  20. 别被“僵尸”吃掉大脑!学会用Kubernetes (K8s)思考

热门文章

  1. axure 抖音部件库_Axure系列教程:最火应用抖音高保真还原全过程
  2. 会计计算机操作步骤,2011年会计证《初级电算化》计算机基本操作讲解
  3. javaweb--------------------dom4j解析xml
  4. Win7+Ubuntu18.04双系统安装
  5. QT+OpenGL反射与折射
  6. P6699 【模板】一般图最大权匹配
  7. Python用三个库,四个步骤,12行代码做一个简单的词云分析<纯学习版>
  8. 树莓派cpu检测_树莓派3B之CPUGPU和内存超频稳定性测试
  9. 漫画算法-学习笔记(03)
  10. canvas制作加载动画并打包发布(原生js和react框架)