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
1.1 服务器端
-
NioDatagramAcceptor acceptor =
new
NioDatagramAcceptor();
-
acceptor.setHandler(new
MyIoHandlerAdapter());
-
-
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
-
chain.addLast("keep-alive"
,
new
HachiKeepAliveFilterInMina());
-
chain.addLast("toMessageTyep"
,
new
MyMessageEn_Decoder());
-
-
-
-
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();
-
-
IoBuffer buffer = IoBuffer.allocate(8
);
-
buffer.putLong(1000
);
-
buffer.flip();
-
session.write(buffer);
-
-
session.getCloseFuture().awaitUninterruptibly();
-
connector.dispose();
2. 超时的几个经验总结:
udp session默认是60秒钟超时,此时状态为closing,数据就发不出去了。
Session的接口是IoSession,udp的最终实现是NioSession。如果交互在60秒内不能处理完成,就需要使用Keep-alive机制,即心跳机制。
3. 心跳
机制
在代码中已经使用了心跳机制,是通过mina的filter实现的,mina自身带的心跳机制好处在于,它附加了处理,让心跳消息不会传到业务层,在底层就完成了。
在上面代码实现中的HachiKeepAliveFilterInMina如下:
-
public
class
HachiKeepAliveFilterInMina
extends
KeepAliveFilter {
-
private
static
final
int
INTERVAL =
30
;
-
private
static
final
int
TIMEOUT =
10
;
-
-
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
);
-
}
-
}
-
-
-
-
-
-
-
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的间隔。
更多可参考:
http://www.ibm.com/developerworks/cn/java/j-lo-mina2
分享到:
相关推荐
在描述中提到的"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 的也可以下载 看看,很值得学习啊!!!