技术笔记:Mina框架(实战详解)

简介: 技术笔记:Mina框架(实战详解)

Apache Mina Server 是一个网络通信应用框架,为开发高性能和高可用性的网络应用程序提供了非常便利的框架。


特点:异步的NIO框架,将UDP当成"面向连接"的协议


一、组件管理


Mina的底层依赖的主要是Java NIO库,上层提供的是基于事件的异步接口


(1)IoService(最底层【起点】)


作用:隐藏底层IO的细节,对上提供统一的基于事件的异步IO接口


IOSocketAcceptor和IOSocketChannel,分别对应TCP协议下的服务端和客户端的IOService,low-level IO经过IOService层后变成IO Event


(2)IoProcessor


作用:负责检查是否有数据在通道上读写


IoProcessor 负责调用注册在IoService 上的过滤器,并在过滤器链之后调用IoHandler


(3)IoFilter(拦截器【关键】)


作用:日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能


(4)IoHandler(业务逻辑处理【终点】)


作用:接收、发送数据


每个IoService都需要指定一个IoHandler


(5)IoSession


作用:是对底层连接(服务器与客户端的特定连接,该连接由服务器地址、端口以及客户端地址、端口来决定)的封装


二、服务端流程:


1、通过SocketAcceptor 同客户端建立连接;


2、连接建立之后 I/O的读写交给了I/O Processor线程,I/O Processor是多线程的;


3、通过I/O Processor 读取的数据经过IoFilterChain里所有配置的IoFilter,IoFilter进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协议;


4、最后IoFilter将数据交给 Handler 进行业务处理,完成了整个读取的过程;


写入过程也是类似,只是刚好倒过来,通过IoSession.write 写出数据,然后Handler进行写入的业务处理,处理完成后交给IoFilterChain,进行消息过滤和协议的转换,最后通过 I/O Processor 将数据写出到 socket 通道


三、服务端代码实现


1、编写IoService(主要功能:设置过滤器,设置handler,绑定端口)


public class MinaServer {


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


public static void main(String【】 args) {


Configuration config = Configuration.getInstance();


try {


config.readConfiguration();


config.initDataSource();


config.initServiceDef();


// 启动FTP读文件,PE积分后台执行


//此处为内部逻辑,通过FTP读取文件,跳过


} catch (Exception e1) {


e1.printStackTrace();


System.exit(1);


}


try {


config.initInterfaceConfig();


// 启动接口调用互斥map维护线程


InterfaceBusThread interfaceBusThread = new InterfaceBusThread();


interfaceBusThread.start();


} catch (Exception e) {


logger.info("InterfaceBus error!", e);


}


NioSocketAcceptor acceptor = null; // 创建连接


try {


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


acceptor = new NioSocketAcceptor(Runtime.getRuntime()


.availableProcessors() + 1);// ioprocesser线程数,一般为cpu数量+1


// 建立工作线程池


Executor threadPool = Executors.newFixedThreadPool(Constant.threadCount);// 设置20个handler线程


// 解决在LINUX服务器上kill掉了,但是端口仍然被占用,要过一段时间才能释放


acceptor.setReuseAddress(true);


// 添加消息过滤器


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


new ProtocolCodecFilter(new XMLObjectCodecFactory()));


//


// 设置服务器能够接收的最大连接数


acceptor.setBacklog(Constant.maxSocketConn);


acceptor.getFilterChain().addLast("executor",


new ExecutorFilter(threadPool));


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


acceptor.getSessionConfig().setReadBufferSize(2048);


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


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


// 绑定逻辑处理器


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


// 绑定端口


acceptor.bind(new InetSocketAddress(Constant.minaServerPort));


logger.info("server start success... port:"


+ Constant.minaServerPort);


} catch (Exception e) {


logger.error("server start error....", e);


e.printStackTrace();


System.exit(1);


}


}


}


2、编写过滤器(即上面代码的添加消息过滤器,这里使用了Mina自带的换行符编解码器工厂,注意:要在acceptor.bind()方法之前执行)


3、编写IoHandler


public class MinaServerHandler extends IoHandlerAdapter {


private final static Logger log = LoggerFactory.getLogger(TCPServerHandler.class);


@Override


public void messageReceived(IoSession session, Object message) throws Exception {


//业务代码在这里编写处理


String str = message.toString();


System.out.println("The message received is 【" + str + "】");


if (str.endsWith("quit")) {


session.close(true);


return;


}


}


@Override


public void sessionCreated(IoSession session) throws Exception {


//代码效果参考:http://hnjlyzjd.com/xl/wz_24761.html

System.out.println("server session created");

super.sessionCreated(session);


}


@Override


public void sessionOpened(IoSession session) throws Exception {


System.out.println("server session Opened");


super.sessionOpened(session);


}


@Override


public void sessionClosed(IoSession session) throws Exception {


System.out.println("server session Closed");


super.sessionClosed(session);


}


}


4、将IoHandler 注册到IoService(即上面代码的绑定逻辑处理器,注意:要在acceptor.bind()方法之前执行)


5、运行MinaServer中的main 方法,可以看到控制台一直处于阻塞状态,等待客户端连接


四、Maven的pom.xml配置


org.apache.mina


//代码效果参考:http://hnjlyzjd.com/xl/wz_24759.html

mina-core

2.0.7


org.apache.mina


mina-integration-spring


1.1.7


五、测试类(模拟客户端请求)


public class AutoTest {


private final static String IP = "localhost";


private final static int PORT = 9002;


public static void main(String【】 args) {


String msg = "testEquityInsertRevequityinsertrev


13632599010120130620";


System.out.println("testEquityInsertRev request msg:"+msg);


System.out.println("testEquityInsertRev response msg:"+testApi(msg));


}


博客园:


Copyright ?2018 不是植物


【转载文章务必保留出处和署名,谢谢!】

相关文章
|
网络协议 安全 Java
Java网络编程基础知识详解
网络编程是现代软件开发中不可或缺的一部分,它使我们能够在不同的计算机之间实现数据传输和通信。Java作为一种强大的编程语言,提供了丰富的网络编程库,使开发者能够轻松地创建网络应用程序。本文将介绍Java网络编程的基础知识,面向初学者,详细讨论网络通信的概念、Socket编程、服务器和客户端编程等内容。
209 0
|
消息中间件 Java 关系型数据库
爆冷门!阿里P8的这份高性能Java架构核心原理解析手册又被吹爆了
市面上讲Java框架的书很多,包括Sping Boot、Spring Cloud、Kafka等,但这些书通常只会让你技术的“量”增长,而“质”仍处于SSM的阶段。而且互联网上并没有体系化、结构化的提升技术的“质”的教材,于是我行动了起来,将我所学的架构思想与实现方式都放入本书中,将提升技术的“质”的方式分享给大家。
114 0
|
3月前
|
Java 应用服务中间件 Linux
(九)Java网络编程无冕之王-这回把大名鼎鼎的Netty框架一网打尽!
现如今的开发环境中,分布式/微服务架构大行其道,而分布式/微服务的根基在于网络编程,而Netty恰恰是Java网络编程领域的无冕之王。Netty这个框架相信大家定然听说过,其在Java网络编程中的地位,好比JavaEE中的Spring。
130 3
|
3月前
|
运维 网络协议 API
入门网络,少不了这份详细的网络基础学习指南!
入门网络,少不了这份详细的网络基础学习指南!
|
5月前
|
SQL cobar 关系型数据库
程序技术好文:点我吧工作总结(技术篇)Cobar原理和环境搭建
程序技术好文:点我吧工作总结(技术篇)Cobar原理和环境搭建
41 0
|
设计模式 前端开发 JavaScript
前端Web开发学习,入门到进阶,推荐几本很不错的书籍
前端Web开发学习,入门到进阶,推荐几本很不错的书籍
161 0
|
存储 前端开发 Java
Netty 爱好者必看!一文详解 ChannelHandler 家族,助你快速掌握 Netty 开发技巧!
Netty 爱好者必看!一文详解 ChannelHandler 家族,助你快速掌握 Netty 开发技巧!
395 0
|
消息中间件 负载均衡 算法
即时通讯技术文集(第21期):后端架构设计基础入门系列 [共15篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第21 期。
80 0
|
负载均衡 网络协议 Dubbo
卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架
什么是RPC? 远程服务调用 官方:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想 通俗一点:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 市面上常见的rpc框架:dobbo,springCloud,gRPC...