Apache MINA 2 是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。它提供了一个抽象的事件驱动的异步 API,可以使用 TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。Apache MINA 2 可以作为开发网络应用程序的一个良好基础。
Apache MINA是非常著名的基于java nio的通信框架,以前都是自己直接使用udp编程,新项目选型中考虑到网络通信可能会用到多种通信方式,因此使用了MINA。
本文结构:
(1)客户端和服务器代码 ;虽然是udp的,但是mina的优美的设计使得所有的通信方式能够以统一的形式使用,perfect。当然注意的是,不同的通信方式,背后的机理和有效的变量、状态是有区别的,所以要精通,那还是需要经验积累和学习的。
(2)超时 和Session的几个实际问题
(3)心跳 ,纠正几个错误
既然是使用,废话少说,直接整个可用的例子。当然了,这些代码也不是直接可用的,我们应用的逻辑有点复杂,不会这么简单使用的。
请参考mina的example包和文档http://mina.apache.org/udp-tutorial.html 。
版本2.0 RC1
- NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
- acceptor.setHandler(new MyIoHandlerAdapter()); //你的业务处理,最简单的,可以extends IoHandlerAdapter
- DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
- chain.addLast("keep-alive" , new HachiKeepAliveFilterInMina()); //心跳
- chain.addLast("toMessageTyep" , new MyMessageEn_Decoder());
- //将传输的数据转换成你的业务数据格式。比如下面的是将数据转换成一行行的文本
- //acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
- chain.addLast("logger" , new LoggingFilter());
- DatagramSessionConfig dcfg = acceptor.getSessionConfig();
- dcfg.setReuseAddress(true );
- acceptor.bind(new InetSocketAddress(ClusterContext.getHeartBeatPort()));
1.2 客户端
- NioDatagramConnector connector = new NioDatagramConnector();
- connector.setConnectTimeoutMillis(60000L);
- connector.setConnectTimeoutCheckInterval(10000 );
- connector.setHandler(handler);
- DefaultIoFilterChainBuilder chain = connector.getFilterChain();
- chain.addLast("keep-alive" , new HachiKeepAliveFilterInMina()); //心跳
- chain.addLast("toMessageTyep" , new MyMessageEn_Decoder());
- chain.addLast("logger" , new LoggingFilter());
- ConnectFuture connFuture = connector.connect(new InetSocketAddress( "10.1.1.1" , 8001 ));
- connFuture.awaitUninterruptibly();
- IoSession session = connFuture.getSession();
- //发送消息长整型 1000
- IoBuffer buffer = IoBuffer.allocate(8 );
- buffer.putLong(1000 );
- buffer.flip();
- session.write(buffer);
- //关闭连接
- session.getCloseFuture().awaitUninterruptibly();
- connector.dispose();
udp session默认是60秒钟超时,此时状态为closing,数据就发不出去了。
Session的接口是IoSession,udp的最终实现是NioSession。如果交互在60秒内不能处理完成,就需要使用Keep-alive机制,即心跳机制。
在代码中已经使用了心跳机制,是通过mina的filter实现的,mina自身带的心跳机制好处在于,它附加了处理,让心跳消息不会传到业务层,在底层就完成了。
在上面代码实现中的HachiKeepAliveFilterInMina如下:
- public class HachiKeepAliveFilterInMina extends KeepAliveFilter {
- private static final int INTERVAL = 30 ; //in seconds
- private static final int TIMEOUT = 10 ; //in seconds
- public HachiKeepAliveFilterInMina(KeepAliveMessageFactory messageFactory) {
- super (messageFactory, IdleStatus.BOTH_IDLE, new ExceptionHandler(), INTERVAL, TIMEOUT);
- }
- public HachiKeepAliveFilterInMina() {
- super ( new KeepAliveMessageFactoryImpl(), IdleStatus.BOTH_IDLE, new ExceptionHandler(), INTERVAL, TIMEOUT);
- this .setForwardEvent( false ); //此消息不会继续传递,不会被业务层看见
- }
- }
- class ExceptionHandler implements KeepAliveRequestTimeoutHandler {
- public void keepAliveRequestTimedOut(KeepAliveFilter filter, IoSession session) throws Exception {
- System.out.println("Connection lost, session will be closed" );
- session.close(true );
- }
- }
- /**
- * 继承于KeepAliveMessageFactory,当心跳机制启动的时候,需要该工厂类来判断和定制心跳消息
- * @author Liu Liu
- *
- */
- class KeepAliveMessageFactoryImpl implements KeepAliveMessageFactory {
- private static final byte int_req = - 1 ;
- private static final byte int_rep = - 2 ;
- private static final IoBuffer KAMSG_REQ = IoBuffer.wrap( new byte []{int_req});
- private static final IoBuffer KAMSG_REP = IoBuffer.wrap( new byte []{int_rep});
- public Object getRequest(IoSession session) {
- return KAMSG_REQ.duplicate();
- }
- public Object getResponse(IoSession session, Object request) {
- return KAMSG_REP.duplicate();
- }
- public boolean isRequest(IoSession session, Object message) {
- if (!(message instanceof IoBuffer))
- return false ;
- IoBuffer realMessage = (IoBuffer)message;
- if (realMessage.limit() != 1 )
- return false ;
- boolean result = (realMessage.get() == int_req);
- realMessage.rewind();
- return result;
- }
- public boolean isResponse(IoSession session, Object message) {
- if (!(message instanceof IoBuffer))
- return false ;
- IoBuffer realMessage = (IoBuffer)message;
- if (realMessage.limit() != 1 )
- return false ;
- boolean result = (realMessage.get() == int_rep);
- realMessage.rewind();
- return result;
- }
- }
有人说:心跳机制的filter只需要服务器端具有即可——这是错误 的,拍着脑袋想一想,看看factory,你就知道了。心跳需要通信两端的实现 。
另外,版本2.0 RC1中,经过测试,当心跳的时间间隔INTERVAL设置为60s(Session的存活时间)的时候心跳会失效,所以最好需要小于60s的间隔。
相关推荐
在描述中提到的"JAVA NIO 异步通信客户端"是指使用NIO API实现的一个客户端程序,它能够在不阻塞主线程的情况下进行网络通信。这通常通过使用Selector和Channel来完成。Selector负责监控多个通道的状态变化,而...
总之,JAVA NIO异步通信模板服务端是利用Java NIO库实现的高效并发服务,通过非阻塞I/O和选择器机制,可以轻松处理大量并发连接,同时保持较低的资源消耗。在实际开发中,这样的模板可以作为基础,根据具体需求进行...
Mina框架是一个轻量级的网络通信框架,基于Java NIO构建,它简化了网络编程的复杂性,提供了高效的I/O处理能力。Mina支持多种协议,如TCP、UDP等,适用于开发服务器端和客户端应用。Mina的核心组件包括IoSession...
Java NIO(New IO)是Java 2平台标准版(J2SE 1.4)引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,极大地提升了I/O性能,并降低了多线程编程的复杂性。NIO与传统的IO(-blocking I/O)相比,最大的...
总结起来,Apache Mina是一个强大且灵活的网络通信框架,通过其事件驱动和异步IO模型,简化了网络应用的开发过程。IoService、IoProcessor、IoFilter和IoHandler这四个关键接口协同工作,确保了数据的高效传输和业务...
### Java NIO通信框架在电信领域的实践 #### 华为电信软件技术架构演进 **1.1 电信软件概述** 电信软件是一个宽泛的概念,根据功能和应用场景的不同大致可以分为两大类:系统软件和业务应用软件。系统软件通常...
在标题中提到的"JAVA nio异步长连接服务端与客户端",我们可以理解为使用Java NIO实现的TCP长连接通信。TCP长连接是指在客户端和服务端之间保持一个持久的连接,可以多次收发数据,而不必每次通信都建立新的连接。这...
在这个示例中,我们主要关注的是Java NIO(非阻塞I/O)和异步Socket。NIO是Java SE 1.4引入的一个新特性,它提供了与传统I/O不同的I/O操作方式,使得开发者可以更有效地处理大量并发连接。 首先,`Service.java`...
描述中提到的源码来源于《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》这篇文章,这表明源码实例是为了解释和展示如何利用MINA2进行基于UDP的网络编程,特别是涉及到了非阻塞I/O(Non-blocking I/O, ...
5. **Java NIO与Mina**:Mina是一个高性能、轻量级的网络应用框架,它利用了Java NIO的特性来构建网络服务。Mina提供了一套高级API,简化了基于NIO的网络编程,包括TCP和UDP协议的支持,以及过滤器链机制,方便实现...
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
[第1节] Java NIO流-简介和概述.flv [第2节] Java NIO流-缓冲区.flv [第3节] Java NIO流-缓冲区操作.flv [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv ...
学习和使用Mina框架,可以帮助开发者快速构建稳定、高效的网络应用,降低网络编程的复杂度,同时充分利用Java NIO的优势。在实际项目中,结合Mina与其他开源库如Spring、Hibernate等,可以构建出更加强大的企业级...
Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...
Java NIO(非阻塞I/O)和AIO(异步I/O)是Java平台中用于提高I/O性能的重要技术。在传统的Java BIO(阻塞I/O)模型中,一个线程对应一个连接,当服务器处理大量并发连接时,线程资源消耗大,效率较低。而NIO和AIO则...
Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。以下是对这些核心概念的...
1. Mina框架概述 Mina框架主要由以下几部分组成: - NIO框架库:MINA利用Java的非阻塞I/O模型,提供高效的数据传输能力。 - 客户端-服务器框架库:MINA支持多种通信协议,可以构建客户端和服务器端应用。 - 网络...
Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!