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 异步通信模板服务端
在CMD运行模式下实现的JAVA异步通信,采用Java.nio包,使用线程实现
Java对io重新包装,大大提高了io的处理效率和复用率。可以用nio代替多线程编程。
java异步通信例子 java NIO 异步socket
Java_NIO基础教程、MINA教程, 并附上基于springboot 整合mina的基础平台框架,可以直接使用,也可以借鉴下
从广义上看电信软件的范围非常广,细分实际可以分为两大类:系统软件和业务应用软件。...本文重点介绍电信业务应用软件的技术变迁历史,以及华为电信软件架构演进和Java NIO框架在技术变迁中起到的关键作用。
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
常见NIO开源框架(MINA、xSocket)学习 基于io包的阻塞式socket通信代码简单,在连接数很少的情况下是一个不错的选择。不过实际应用中一个socket服务器采用传统的阻塞式socket方式通信可能会是一场灾难,一路...
Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...
JAVA.NIO 异步长连接客户端与服务端都有,大家可以看看,另不知道怎么样将客户端读取的BUFF后的数据进行处理可以给出修改吗?
Ioserver java Nio socket 框架 是个不错的NIO 通讯框架,本来想学习mina框架,看了看mina的源码太头痛,本人觉得看懂了Ioserver 再看mina的框架,想多的学习 java NIO 的也可以下载 看看,很值得学习啊!!!
整理:网站建设与网站制作公司-VeiSun.Com)简单介绍:MINA框架是对java的NIO包的一个封装,简化了NIO程序开发的难度
Java异步通信编程NIO
NIO通信框架 网络 通信 类 收集的资料 java 可以使用
java bio nio aio socket
java nio入门学习,两个pdfjava nio入门学习,两个pdf
java NIO 创建的服务端,能够异步响应客户端的请求,客户端采用nio异步请求服务端,通信之间的乱码使用charset解决
[第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 ...
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...