MINA框架新人指南
- 格式:pdf
- 大小:709.49 KB
- 文档页数:9
Mina简单的⼊门⽰例Mina是Apache下的⼀个⽹络应⽤程序框架,⽤来帮助⽤户简单地开发⾼性能和⾼可扩展性的⽹络应⽤程序。
它提供了⼀个通过Java NIO在不同的传输协议上抽象的事件驱动的异步API,例如TCP/IP和UDP/IP。
还没了解原理之前,我们先从官⽹例⼦改写⼀下,从实践开始。
我记得⼊⾏前有个前辈说过,学习任何新技术,不要先急着了解其原理,先找个例⼦实践⼀下。
我觉得相当正确,因为没有谁在学习⾃⾏车前,是先把⾃⾏车运⾏原理弄清楚的。
依赖:jdk1.7开发环境:ideaIU-14.1.4测试环境:win7建⽴maven⼯程MinaDemo,在pom.xml配置⽂件添加必要的依赖:12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<?xml version="1.0"encoding="UTF-8"?><project xmlns=""xmlns:xsi=""xsi:schemaLocation=" "><modelVersion>4.0.0</modelVersion><groupId>MinaDemo</groupId><artifactId>MinaDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId><version>2.0.9</version></dependency></dependencies></project>TimeServer.java类:12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30package com.mangocool.mina;import java.io.IOException;import .InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.prefixedstring.PrefixedStringCodecFactory;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;/*** Created by MANGOCOOL on 2015/10/20.*/public class TimeServer {private static final int PORT = 9123;public static void main(String[] args) throws IOException{// 创建服务监听器,6是IoProcessor的线程数IoAcceptor acceptor = new NioSocketAcceptor(6);// 增加⽇志过滤器acceptor.getFilterChain().addLast("logger", new LoggingFilter());// 增加编码过滤器,统⼀编码UTF-8acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new PrefixedStringCodecFactory(Charset.forName("UTF-8")))); // 设置服务端逻辑处理器acceptor.setHandler(new TimeServerHandler());30 31 32 33 34 35 36 37 38 39 acceptor.setHandler(new TimeServerHandler());// 设置读缓存⼤⼩acceptor.getSessionConfig().setReadBufferSize(2048);// 设置指定类型的空闲时间,空闲时间超过这个值将触发sessionIdle⽅法 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 绑定端⼝acceptor.bind(new InetSocketAddress(PORT));}}TimeServerHandler.java类:1234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56package com.mangocool.mina;import java.util.Date;import org.apache.mina.core.service.IoHandler;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;/*** Created by MANGOCOOL on 2015/10/20.*/public class TimeServerHandler implements IoHandler {@Overridepublic void exceptionCaught(IoSession session, Throwable throwable) throws Exception{throwable.printStackTrace();}@Overridepublic void messageReceived(IoSession session, Object message) throws Exception{String str = message.toString();System.out.println("server端接收到的消息:"+ str);if(str.trim().equalsIgnoreCase("exit")){session.close(true);return;}Date date = new Date();session.write(date.toString());}@Overridepublic void messageSent(IoSession session, Object message) throws Exception{System.out.println("server端发送信息:"+ message.toString());}public void inputClosed(IoSession session) throws Exception{System.out.println("server端:"+ session.getId() + " 关闭输⼊");}@Overridepublic void sessionClosed(IoSession session) throws Exception{System.out.println("server端IP:"+ session.getRemoteAddress().toString() + " 关闭连接"); System.exit(0);}@Overridepublic void sessionCreated(IoSession session) throws Exception{System.out.println("server端IP:"+ session.getRemoteAddress().toString() + " 创建连接"); }@Overridepublic void sessionIdle(IoSession session, IdleStatus status) throws Exception56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 public void sessionIdle(IoSession session, IdleStatus status) throws Exception{System.out.println("server端闲置连接:会话 "+ session.getId() + " 被触发 "+ session.getIdleCount(status) + " 次"); }@Overridepublic void sessionOpened(IoSession session) throws Exception{System.out.println("server端打开连接");}}public void exceptionCaught(IoSession session, Throwable cause) 当接⼝中其他⽅法抛出异常未被捕获时触发此⽅法。
Joomla网站搭建的基本操作指南第一章:介绍Joomla和其优势Joomla是一种开源内容管理系统,用于创建和管理网站的工具。
它是在PHP语言下开发的,具有用户友好的界面和丰富的功能。
Joomla被广泛应用于个人博客、企业网站和电子商务平台等各种类型的网站。
其优势包括灵活性,可扩展性,以及大量的模块和插件可供选择。
第二章:Joomla的安装在开始创建网站之前,我们先来了解如何安装Joomla。
首先,您需要下载Joomla的安装包并将其上传到您的网站主机。
然后,创建一个新的MySQL数据库,并将其相关信息输入到Joomla的安装向导中。
随后,按照向导的指示完成安装。
完成后,您将获得一个Joomla的管理员账户,可以用来管理您的网站。
第三章:Joomla的基本设置一旦安装完成,您需要进行一些基本设置来适应您的网站需求。
您可以设置网站的名称、描述和Logo等信息。
此外,您还可更改网站的默认语言和时区。
要进行这些设置,只需登录到Joomla的后台管理界面,转到全局配置部分,并按照您的需求逐一调整。
第四章:Joomla的模板选择与编辑Joomla提供了大量的模板供您选择,您可以根据自己的喜好和网站主题进行选择。
从Joomla官方网站或第三方网站下载所需模板,并将其上传到Joomla的模板目录中。
然后,在后台管理界面中,转到模板管理部分,选择您上传的模板并进行编辑。
您可以调整布局、颜色和字体等,以使其与您的品牌形象一致。
第五章:Joomla的内容管理Joomla的核心功能之一是内容管理。
您可以创建各种类型的内容,包括文章、图片、视频和音频等。
在后台管理界面中,您可以创建新的文章,并设置其标题、文本和元数据等信息。
此外,您还可以为文章添加标签和分类,以便更好地组织和检索。
第六章:Joomla的扩展功能Joomla的强大之处在于其丰富的模块和插件。
它们可以为您的网站增加各种功能,如社交分享、网站地图和网上支付等。
MINA2实用手册作者:李庆丰Email:scholers@MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度,封装了很多底层的细节,然开发者把精力集中到业务逻辑上来,最近做了一个相关的项目,为了备忘对MINA做一个总结。
一、服务端初始化及参数配置MINA2初始化很简单。
基本的初始化参数如下://初始化Acceptor—可以不指定线程数量,MINA2里面默认是CPU数量+2 NioSocketAcceptor acceptor = new NioSocketAcceptor(5);java.util.concurrent.Executor threadPool =Executors.newFixedThreadPool(1500);//建立线程池//加入过滤器(Filter)到Acceptoracceptor.getFilterChain().addLast("exector", newExecutorFilter(threadPool));//编码解码器acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new WebDecoder(),newXmlEncoder()));//日志LoggingFilter filter = new LoggingFilter();filter.setExceptionCaughtLogLevel(LogLevel.DEBUG);filter.setMessageReceivedLogLevel(LogLevel.DEBUG);filter.setMessageSentLogLevel(LogLevel.DEBUG);filter.setSessionClosedLogLevel(LogLevel.DEBUG);filter.setSessionCreatedLogLevel(LogLevel.DEBUG);filter.setSessionIdleLogLevel(LogLevel.DEBUG);filter.setSessionOpenedLogLevel(LogLevel.DEBUG);acceptor.getFilterChain().addLast("logger", filter);acceptor.setReuseAddress(true);//设置的是主服务监听的端口可以重用acceptor.getSessionConfig().setReuseAddress(true);//设置每一个非主监听连接的端口可以重用MINA2中,当启动一个服务端的时候,要设定初始化缓冲区的长度,如果不设置这个值,系统默认为2048,当客户端发过来的消息超过设定值的时候,MINA2的机制是分段接受的,将字符是放入缓冲区中读取,所以在读取消息的时候,需要判断有多少次。
APACHE MINA 介绍一个高性能的NIO框架•MINA 的用途•MINA 选择MINA的理由•MINA 的快速入门•MINA 的高级话题讲座目标背景,用途以及所支持的功能的一个简略介绍,让大家认识MINA,对它有个初步概念。
这就是本章的目的。
在java世界中,框架繁多,就网络框架而言,我们为什么要选择MINA2这确实值得我们探讨一下。
下面的小节中将本着对软件开发最基本的两点出发进行对比:1.性能的对比2.程序实现的复杂性对比在传统I/O中,最简单实现高并发服务器的编程方式就是对每一个客户开启一个线程。
但是这种方式有如下几个弊端:•客户端上限很大的情况下不能及时响应•服务器硬件资源受限,性能也会急剧下降•受制于操作系统的限制优点还是有的:•编码简单,实现容易•一定数量的连接性能比较好。
参见实例:TraditionalIOServer0从图中可见,每一个线程维护了一组用户,然后每一个线程不断的轮询用户,哪个用户可读就读取相应的可读字节数,也就是这种方式避免了读的阻塞。
但是这种方式是一种被动的方式,也就是说不管用户是否可读,都需要去轮询。
为了解决这一问题,异步的NIO就成了不二之选选择MINA的理由NIO简单介绍JDK1.4提供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,又同时避免了轮询问题,但在使用上略显得复杂一些。
NIO的核心思想就是多路复用,与模型二类似。
但是它是基于事件机制,所以这就是能避开轮询的原因。
但是需要注意的是,他们本质上是不同的,模型二只能算是一个模拟的多路复用,而NIO则是利用OS底层以及一些别的技术来达到异步多路复用的目的。
看完几个实际的MINA例子后可以很轻易的总结出利用MINA编程的几个大致步骤:1.创建一个实现了IoService接口的类2.设置一个实现了IoFilter接口的过滤器(如果有需要的情况下)3.设置一个IoHandler接口实现的处理类,用于处理事件(必须)4.对IoService绑定一个端口开始工作IoProcessor是处理请求的分配,包括选择Selector,超时验证,状态记录等。
Mina2.0框架源码剖析Mina2.0快速入门MinaTimeServer.javapackage com.vista;import java.io.IOException;import java.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class MinaTimeServer{private static final int PORT = 6488;public static void main(String[] args) throws IOException{//监听即将到来的TCP连接IoAcceptor acceptor = new NioSocketAcceptor();acceptor.getFilterChain().addLast("logger", new LoggingFilter ());acceptor.getFilterChain().addLast("codec", new ProtocolCodecF ilter( new TextLineCodecFactory( Charset.forName("UTF-8"))));acceptor.setHandler(new TimeServerHandler());acceptor.getSessionConfig().setReadBufferSize(2048);acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDL E, 10);acceptor.bind(new InetSocketAddress(PORT));System.out.println("服务器启动");}}TimeServerHandler.javapackage com.vista;import java.util.Date;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;public class TimeServerHandler extends IoHandlerAdapter{public void exceptionCaught(IoSession session, Throwable cause) t hrows Exception{cause.printStackTrace();}public void messageReceived(IoSession session, Object message) th rows Exception{String strMsg = message.toString();if(strMsg.trim().equalsIgnoreCase("quit")){session.close();return;}Date date = new Date();session.write(date.toString());System.out.println("Message written");}public void sessionIdle(IoSession session, IdleStatus status) thr ows Exception{System.out.println("IDLE"+session.getIdleCount(status));}}Mina2.0框架源码剖析(一)整个框架最核心的几个包是:org.apache.mina.core.service,org.apache.mina.core.session, org.apache.mina.core.polling以及org.apache.mina.transport.socket。
mina 框架学习转帖:/s/blog_5f9beca40101ee6w.html1、简介Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP 协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。
Apache Mina也称为:l NIO框架l客户端/服务端框架(典型的C/S架构)l 网络套接字(networking socket)类库2、通信流程那么让我们来看一下mina在我们应用中处于什么样的一个位置呢上图可以看出mina位于应用程序和底层网络传输之间,它不关心底层网络数据如何传输,只负责接收底层数据,过滤并转换为Java对象提供给我们的应用程序,然后把应用程序响应值过滤并转换为底层识别的字节,提供给底层传输。
再来看一下mina 通信流程图可以很清晰看出mina主要有三个主要的业务接口:IoService,IoFilter和IoHandler(1) IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立。
(2) IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能,其中数据的encode 与decode是最为重要的、也是你在使用Mina 时最主要关注的地方。
(3) IoHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。
总的来说创建一个基于mina框架的应用分为三个模块: 创建连接(IoService))——>添加消息过滤器(IoFilter)——>添加业务处理(IoHandler)3、server 和clientmina中server和client没有多大区别都是通过Ioservice建立连接和通信的,来看下具体流程Server 一般地,服务端会有一个端口来监听client的请求/packet,并且为每隔connect建立一个session(无论是基于TCP/IP协议还是UDP协议),Server端主要通过IoAccptor建立连接IOAcceptor继承自IoService主要用于监听网络进来的connecter和packet,对于一个新的连接首先会创建一个session,连接创建之后请求消息会从你的地址和监听的端口中进来并封装所以的packet接收完成之后如上图所示,过滤器链会对其进行过滤,过滤完成之后会交给IoHandler进行业务处理,这就是一个请求到达server后mina的处理流程。
详解微信⼩程序开发框架(MINA)⼩程序MINA框架,及优点MINA框架:⼩程序使⽤的是MINA框架,⽬的是通过简单、⾼效的⽅式让开发者可以在微信中开发具有原⽣App体验的服务。
MINA的核⼼是⼀个响应的数据绑定系统。
整个系统分为两块:视图层(view,描述语⾔wxml和wxss)和逻辑层(App Serice,基于 JavaScript)。
这可以让数据与视图⾮常简单的保持同步。
当做数据修改时,只需要在逻辑层改数据,视图层就会做响应的更新。
开发者只需要将页⾯路由、⽅法、⽣命周期函数注册进框架,其他的⼀切复杂的操作都将由框架处理。
⼩程序优点:• ⽅便使⽤:⽆需下载,打开即⽤,⽤完即⾛。
不占⽤⼿机内存,省流量,省安装时间• 开发简单:开发的本质是MVVM风格的Javascript框架上开发的,有前端经验的程序员可以⽆缝衔接,⽆经验的“⼩⽩”也可以快速⼊门。
• 跨平台运⾏:不⽤再分别开发IOS和Andriod版本,只需要发布微信⼩程序平台,所有平台都可以使⽤。
开发成本低• 快速分发与迭代:⽆需关⼼各种发布渠道,也⽆须担⼼旧版本升级的兼容问题。
打开速度⽐H5快,体验接近原⽣APP⼩程序开发框架的⽬标是通过尽可能简单、⾼效的⽅式让开发者可以在微信中开发具有原⽣ APP 体验的服务。
微信团队为⼩程序提供的框架命名为MINA。
MINA框架通过封装微信客户端提供的⽂件系统、⽹络通信、任务管理、数据安全等基础功能,对上层提供⼀整套JavaScript API,让开发者⽅便的使⽤微信客户端提供的各种基础功能与能⼒,快速构建应⽤。
MINA框架微信⼩程序的框架⽰意图如下所⽰:MINA框架主要分为两⼤部分:第⼀部分页⾯视图层,开发者使⽤WXML⽂件来搭建页⾯的基本视图结构(WXML是类似于HTML标签的语⾔和⼀系列基础组件),使⽤WXSS⽂件来控制页⾯的表现样式。
第⼆部分AppService应⽤逻辑层,是MINA框架的服务中⼼,通过微信客户端启动异步线程单独加载运⾏,页⾯渲染所需的数据、页⾯交互处理逻辑都在其中实现。
简介:Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。
它提供了一个抽象的事件驱动的异步API,可以使用TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。
Apache MINA 2 可以作为开发网络应用程序的一个良好基础。
本文将介绍Apache MINA 2 的基本概念和API,包括I/O 服务、I/O 会话、I/O 过滤器和I/O 处理器。
另外还将介绍如何使用状态机。
本文包含简单的计算器服务和复杂的联机游戏两个示例应用。
Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。
它提供了一个抽象的事件驱动的异步API,可以使用TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。
Apache MINA 2 可以作为开发网络应用程序的一个良好基础。
下面将首先简单介绍一下Apache MINA 2。
Apache MINA 2 介绍Apache MINA 是Apache 基金会的一个开源项目,目前最新的版本是 2.0.0-RC1。
本文中使用的版本是 2.0.0-M6。
从参考资料中可以找到相关的下载信息。
下面首先介绍基于Apache MINA 的网络应用的一般架构。
基于Apache MINA 的网络应用的架构基于Apache MINA 开发的网络应用,有着相似的架构。
图1中给出了架构的示意图。
图 1. 基于Apache MINA 的网络应用的架构如图1所示,基于Apache MINA 的网络应用有三个层次,分别是I/O 服务、I/O 过滤器和I/O 处理器:⎽I/O 服务:I/O 服务用来执行实际的I/O 操作。
Apache MINA 已经提供了一系列支持不同协议的I/O 服务,如TCP/IP、UDP/IP、串口和虚拟机内部的管道等。
开发人员也可以实现自己的I/O 服务。
⎽I/O 过滤器:I/O 服务能够传输的是字节流,而上层应用需要的是特定的对象与数据结构。
Mina的线程池实现分析(1)文章分类:Java编程线程池是并发应用中,为了减少每个任务调用的开销增强性能而经常使用的技术。
在mina中大量的使用这一技术,除了Executors的工厂方法构建线程池之外,它还继承自ThreadPoolExecutor提供自己的线程池的实现OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor。
这两者主要应用于ExecutorFilter过滤器。
这个过滤器是mina内部实现的众多过滤器之一,其主要作用是把I/O events提交给线程池同时处理同一个IOSession的事件,其默认的线程池的构造是前者。
这两个线程池的区别就在于同时处理I/O 事件时,前者能够保证同一个Session的事件的处理顺序,而后者则不能保证,所以有可能出现sessionClosed事件在messageReceived 事件之前被处理。
下面试着从代码解密其怎么保证事件处理顺序的。
分析Mina的源码最大的感受就是其多线程应用的精细,每次从源码解决自己的疑问都有一种难以言喻的喜悦感。
如果一般的框架的源码主要看设计结构的话,Mina的源码的精妙更在于具体的实现,虽然乍一看是复杂又混乱,呵呵。
先看看部分源码吧:Java代码1public class OrderedThreadPoolExecutor extends ThreadPoolExecutor {2 ...3private static final IoSession EXIT_SIGNAL = new DummySession();45private final AttributeKey TASKS_QUEUE = new AttributeKey(getClass(), "tasksQueue");67private final BlockingQueue<IoSession> waitingSessions = new LinkedBlockingQueue<IoSession>();89private final Set<Worker> workers = new HashSet<Worker>();1011private final AtomicInteger idleWorkers = new AtomicInteger();1213private long completedTaskCount;14private volatile boolean shutdown;15 ...16private SessionTasksQueue getSessionT asksQueue(IoSession session) {17SessionTasksQueue queue = (SessionT asksQueue) session.getAttribute(TASKS_QUEUE);18if (queue == null) {19queue = new SessionTasksQueue();20SessionTasksQueue oldQueue =21(SessionTasksQueue) session.setAttributeIfAbsent(TASKS_QUEUE, queue);2223if (oldQueue != null) {24queue = oldQueue;25}26}2728return queue;29}3031private void addWorker() {32synchronized (workers) {33if (workers.size() >= super.getMaximumPoolSize()) {34return;35}3637// Create a new worker, and add it to the thread pool38Worker worker = new Worker();39Thread thread = getThreadFactory().newThread(worker);4041// As we have added a new thread, it's considered as idle.42idleWorkers.incrementAndGet();4344// Now, we can start it.45thread.start();46workers.add(worker);4748if (workers.size() > largestPoolSize) {49largestPoolSize = workers.size();50}51}52}5354private class SessionTasksQueue {55private final Queue<Runnable> tasksQueue = new ConcurrentLinkedQueue<Runnable>();5657private boolean processingCompleted = true;58}59 ...60}首先看到的是OrderedThreadPoolExecutor的部分实现,其除了含有ThreadPoolExecutor的一些静态常量之外,这里列出了自身特有的几个变量。
支付宝(中国)网络技术有限公司
蓝秋鹏(仲景)
目录
1.前言 (3)
2.实践 (4)
2.1.服务端演示 (4)
2.2.客户端演示 (6)
3.进阶 (8)
在资金线混有两个技术框架是一定要懂得如何使用的,它们就是MINA和HTTPCLIENT(还没听过的,就先百度一下)。
支付宝和银行前置机之间的通讯基本都是使用者两种框架,即使你不懂SOCKET或者HTTP很底层的协议也没多大关系。
对于HTTPCLIENT有过很多实践了,从我刚进支付宝的第一个项目个人诚信通,到最近的建行境外收单直连改造,都是使用HTTP通讯。
突然间要做建行银行卡代扣,需要使用SOCKET跟建行通讯,对SOCKET 一点都不懂,只是听大禹和香石说使用MINA很简单,闭关修炼了两天确实很简单,哈哈。
先找到MINA的主页,肯定有很多资料可以学习的,然后再编写DEMO,跑起来,改改DEMO,添加一些个性化的功能,两天时间基本上就算入门啦,可以开始进入项目编码啦。
这些时间对于开发工程师来说,就是项目的技术准备阶段,在BRD或者PRD阶段投入的资源,让开发人员在开发阶段不再担心技术问题,可以快速编码,甚至提前完成开发任务。
跟MINA类似的框架,还有著名的Jboss Netty,代码框架非常类似,使用方法也大同小异,可以说Jboss Netty是MINA的改良版,但是目前我们系统还没有Jboss Netty的实际应用,不考虑引入到实际项目中。
本文档作为MINA框架的入门手册,浅显易懂,没有高级应用,比如配置线程模型,就可以满足日常开发。
跟银行的通讯,首先我们要定位自己的角色,我们扮演的是客户端,还是服务端,大部分场景我们都是扮演客户端的角色,如果银行有通知接口,在业务做完时银行会主动通知我们,推进我们的业务,这时我们就是服务端。
2.1.服务端演示
通过DEMO实现一个简单的服务端,MINA框架已经做了很好的封装,我们只需要编写几行代码,通过main启动MinaServer,监听端口1314:
SOCKET接口是TCP/IP网络的API,不说这些很抽象的概念,我们可以直接使用MINA封装的SocketAcceptor 。
main方法中定义了整型的端口1314,在实际应用中一般通过antx.properties配置端口,这样就可以把配置的权限交给运维部门。
每一个信息都会通过在IoAcceptor中定义的过滤器链的所有过滤器,完成个性化的日志记录和解码工作。
日志过滤器用SL4J库记录信息,而编码过滤器则解码所有收到的信息.
这个简单的例子,我们使用 new TextLineCodecFactory() 发送的信息进行编码,这是MINA自带的,功能有限,只能处理文本或者String类型。
还有一个参数new ServerHandler(),传的是实现IoHandler接口的类,对客户端的请求要进行什么业务处理,都在这里实现。
主要参考服务端处理器的实现:
messageReceived(…),对接收到的消息(已经解码)进行下一步处理,DEMO中演示的就是收到客户端的请求消息之后,都返回客户端的IP地址。
exceptionCaught(…),自定义异常处理,要不然异常会被“吃掉”。
这是服务端处理器比较重要的两个接口,还有其他一些辅助的接口,对于需要比较详细的日志记录时可以使用。
命令行:telnet 127.0.0.1 1314 (这种方法经常用来测试我们跟银行建立的专线是否畅通,而不是使用ping命令)
建立连接以后,输入hello,服务端就会有相应。
测试演示图:
2.2. 客户端演示
我们使用的是telnet 做客户端发包给服务器, 现在我们使用MINA 框架编写一个简单的客户端,你会发现客户端和服务器的代码非常类似。
通过main 方法启动客户端:
客户端演示的是直接发送String 消息,可以使用MINA 自带的编码协议,
客户端处理器和服务端处理器是很像的,它们都是在收到数据包之后的处理。
主要参考客户端处理器的实现:
这里比服务端处理器新增一个接口messageSent(…),在实际应用中我们经常需要记录我们发送给银行的日志,可以作为一种交易凭证,方便后期问题追踪。
日志的记录需要有唯一性的标记,最好的办法就是把报文的标记在发送之前保存在IoSession,使用session.getAttribute("KEY")取出标记。
客户端效果演示(因为没有配置log4j,会抛出红色警告):
服务端效果演示:
3. 进 阶
在项目开发的实际应用中,我们跟银行的通讯报文一般都不会使用String 传输,因为系统的运行环境或者编程语言一般都是不同的,最常用的就是以字节传输,报文的格式需要双方约定规范,比如xml 格式,或者定长格式,或者8583格式,最终都会转换成字节传输给银行。
那么这里就需要我们编写自定义的编码和解码方案。
编写编码方案工厂类,注册自定义的编码方案:
这里提供了两种构造函数,对于启动main 方式的测试,选择空构造行数就可以了;带参构造函数是为了兼容在实际应用中Spring 框架,在bean 声明中采用构造函数的方式注入。
工厂类的使用方法,在客户端和服务器的main 启动程序,修改MINA 框架自带的String 编码方案工厂类:
自定义的编码方案实现类:
这里处理很简单,就是把字节转化成String,那么messageReceived(IoSession session, Object message)接口获取message就是String类型的,已经经过解码。
在这里可以进行很多方式的解码,比如转化成String以后,还可以进一步转化成POJO,那么获取的message就是POJO。