没有合适的资源?快使用搜索试试~ 我知道了~
首页Apache-Mina教程.pdf
Apache-Mina教程.pdf
需积分: 9 10 下载量 25 浏览量
更新于2023-05-29
收藏 363KB PDF 举报
mina框架介绍、主要接口介绍:IoService、IoAcceptor、IoConnector、IoSession、IoSessionConfig、IoHandler、IoBuffer、IoFuture等;信息分段处理demo、多路分离编解码demo、与Spring/JMX集成示例
资源详情
资源推荐
Apache Mina Server 2.0
中文参考手册
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP
协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),
Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异
步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。
Mina 主要有1.x 和2.x 两个分支,这里我们讲解最新版本2.0,如果你使用的是Mina 1.x,
那么可能会有一些功能并不适用。学习本文档,需要你已掌握JAVA IO、JAVA NIO、JAVA
Socket、JAVA 线程及并发库(java.util.concurrent.*)的知识。
Mina 同时提供了网络通信的Server 端、Client 端的封装,无论是哪端,Mina 在整个网通
通信结构中都处于如下的位置:
可见Mina 的API 将真正的网络通信与我们的应用程序隔离开来,你只需要关心你要发送、
接收的数据以及你的业务逻辑即可。
同样的,无论是哪端,Mina 的执行流程如下所示:
(1.) IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监
听是否有连接被建立。
(2.) IoProcessor:这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是
说它也拥有自己的Selector,这是与我们使用JAVA NIO 编码时的一个不同之处,
通常在JAVA NIO 编码中,我们都是使用一个Selector,也就是不区分IoService
与IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在IoService 上
的过滤器,并在过滤器链之后调用IoHandler。
(3.) IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、
数据的编码(write 方向)与解码(read 方向)等功能,其中数据的encode 与decode
是最为重要的、也是你在使用Mina 时最主要关注的地方。
(4.) IoHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。
_______________________________________________________________________________
1. 简单的TCPServer:
(1.) 第一步:编写IoService
按照上面的执行流程,我们首先需要编写IoService,IoService 本身既是服务端,又是客
户端,我们这里编写服务端,所以使用IoAcceptor 实现,由于IoAcceptor 是与协议无关的,
因为我们要编写TCPServer,所以我们使用IoAcceptor 的实现NioSocketAcceptor,实际上
底层就是调用java.nio.channels.ServerSocketChannel 类。当然,如果你使用了Apache 的
APR 库,那么你可以选择使用AprSocketAcceptor 作为TCPServer 的实现,据传说Apache
APR
库的性能比JVM 自带的本地库高出很多。
那么IoProcessor 是由指定的IoService 内部创建并调用的,我们并不需要关心。
public class MyServer {
main方法:
IoAcceptor acceptor=new NioSocketAcceptor();
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);
acceptor.bind(new InetSocketAddress(9123));
}
这段代码我们初始化了服务端的TCP/IP 的基于NIO 的套接字,然后调用IoSessionConfig
设置读取数据的缓冲区大小、读写通道均在10 秒内无任何操作就进入空闲状态。
(2.) 第二步:编写过滤器
这里我们处理最简单的字符串传输,Mina 已经为我们提供了TextLineCodecFactory 编解码
器工厂来对字符串进行编解码处理。
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(
new TextLineCodecFactory(
Charset.forName("UTF-8"),
LineDelimeter.WINDOWS.getValue(),
LineDelimiter. WINDOWS.getValue()
)
)
);
这段代码要在acceptor.bind()方法之前执行,因为绑定套接字之后就不能再做这些准备工
作了。
这里先不用清楚编解码器是如何工作的,这个是后面重点说明的内容,这里你只需要清楚,
我们传输的以换行符为标识的数据,所以使用了Mina 自带的换行符编解码器工厂。
(3.) 第三步:编写IoHandler
这里我们只是简单的打印Client 传说过来的数据。
public class
MyIoHandler
extends
IoHandlerAdapter {
// 这里我们使用的SLF4J作为日志门面,至于为什么在后面说明。
private final static
Logger
log
= LoggerFactory
.
getLogger
(MyIoHandler.
class
);
@Override
public void
messageReceived(IoSession session, Object message)
throws
Exception {
String str = message.toString();
log
.info("The message received is [" + str + "]");
if
(str.endsWith("quit")) {
session.close(
true
);
return
;
}
}
}
然后我们把这个IoHandler 注册到IoService:
acceptor.setHandler(new MyIoHandler());
当然这段代码也要在acceptor.bind()方法之前执行。
然后我们运行MyServer 中的main 方法,你可以看到控制台一直处于阻塞状态,此时,我们
用telnet 127.0.0.1 9123 访问,然后输入一些内容,当按下回车键,你会发现数据在
Server 端被输出,但要注意不要输入中文,因为Windows 的命令行窗口不会对传输的数据
进行UTF-8 编码。当输入quit 结尾的字符串时,连接被断开。
这里注意你如果使用的操作系统,或者使用的Telnet 软件的换行符是什么,如果不清楚,
可以删掉第二步中的两个红色的参数,使用TextLineCodec 内部的自动识别机制。
_______________________________________________________________________________
2. 简单的TCPClient:
这里我们实现Mina 中的TCPClient,因为前面说过无论是Server 端还是Client 端 ,在 Mina
中的执行流程都是一样的。唯一不同的就是IoService 的Client 端实现是IoConnector。
(1.) 第一步:编写IoService并注册过滤器
public class MyClient {
main方法:
IoConnector connector=new NioSocketConnector();
connector.setConnectTimeoutMillis(30000);
connector.getFilterChain().addLast("codec",
new ProtocolCodecFilter(
new TextLineCodecFactory(
Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue()
)
)
);
connector.connect(new InetSocketAddress("localhost", 9123));
}
(2.) 第三步:编写IoHandler
public class
ClientHandler
extends
IoHandlerAdapter {
private final static
Logger
LOGGER
= LoggerFactory
.
getLogger
(ClientHandler.
class
);
private final
String values;
public
ClientHandler(String values) {
this
.values = values;
}
@Override
public void
sessionOpened(IoSession session) {
session.write(values);
}
}
注册IoHandler:
connector.setHandler(new ClientHandler("你好!\r\n 大家好!"));
然后我们运行MyClient,你会发现MyServer 输出如下语句:
The message received is [你好!]
The message received is [大家好!]
我们看到服务端是按照收到两条消息输出的,因为我们用的编解码器是以换行符判断数据是
否读取完毕的。
_______________________________________________________________________________
3. 介绍Mina的TCP的主要接口:
通过上面的两个示例,你应该对Mina 如何编写TCP/IP 协议栈的网络通信有了一些感性的认
识。
(1.)IoService:
这个接口是服务端IoAcceptor、客 户 端 IoConnector 的抽象,提供IO 服务和管理IoSession
的功能,它有如下几个常用的方法:
A. TransportMetadata getTransportMetadata():
这个方法获取传输方式的元数据描述信息,也就是底层到底基于什么的实现,譬如:nio、
apr 等。
B. void addListener(IoServiceListener listener):
这个方法可以为IoService 增加一个监听器,用于监听IoService 的创建、活动、失效、空
闲、销毁,具体可以参考IoServiceListener 接口中的方法,这为你参与IoService 的生命
周期提供了机会。
C. void removeListener(IoServiceListener listener):
这个方法用于移除上面的方法添加的监听器。
D. void setHandler(IoHandler handler):
这个方法用于向IoService 注册IoHandler,同时有getHandler()方法获取Handler。
E. Map<Long,IoSession> getManagedSessions():
这个方法获取IoService 上管理的所有IoSession,Map 的key 是IoSession 的id。
F. IoSessionConfig getSessionConfig():
这个方法用于获取IoSession 的配置对象,通过IoSessionConfig 对象可以设置Socket 连
接的一些选项。
_______________________________________________________________________________
(2.)IoAcceptor:
这个接口是TCPServer 的接口,主要增加了void bind()监听端口、void unbind()解除对
套接字的监听等方法。这里与传统的JAVA 中的ServerSocket 不同的是IoAcceptor 可以多
次调用bind()方法(或者在一个方法中传入多个SocketAddress 参数)同时监听多个端口。
_______________________________________________________________________________
(3.)IoConnector:
这个接口是TCPClient 的接口, 主要增加了ConnectFuture connect(SocketAddress
remoteAddress,SocketAddress localAddress)方法,用于与Server 端建立连接,第二个参
数如果不传递则使用本地的一个随机端口访问Server 端。这个方法是异步执行的,同样的,
也可以同时连接多个服务端。
_______________________________________________________________________________
(4.)IoSession:
这个接口用于表示Server 端与Client 端的连接,IoAcceptor.accept()的时候返回实例。
这个接口有如下常用的方法:
A. WriteFuture write(Object message):
这个方法用于写数据,该操作是异步的。
B. CloseFuture close(boolean immediately):
这个方法用于关闭IoSession,该操作也是异步的,参数指定true 表示立即关闭,否则就
在所有的写操作都flush 之后再关闭。
C. Object setAttribute(Object key,Object value):
这个方法用于给我们向会话中添加一些属性,这样可以在会话过程中都可以使用,类似于
HttpSession 的setAttrbute()方法。IoSession 内部使用同步的HashMap 存储你添加的自
定义属性。
D. SocketAddress getRemoteAddress():
这个方法获取远端连接的套接字地址。
E. void suspendWrite():
这个方法用于挂起写操作,那么有void resumeWrite()方法与之配对。对于read()方法同
样适用。
F. ReadFuture read():
这个方法用于读取数据, 但默认是不能使用的, 你需要调用IoSessionConfig 的
setUseReadOperation(true)才可以使用这个异步读取的方法。一般我们不会用到这个方法,
因为这个方法的内部实现是将数据保存到一个BlockingQueue,假如是Server 端,因为大
量的Client 端发送的数据在Server 端都这么读取,那么可能会导致内存泄漏,但对于
Client,可能有的时候会比较便利。
G. IoService getService():
这个方法返回与当前会话对象关联的IoService 实例。
关于TCP连接的关闭:
无论在客户端还是服务端,IoSession 都用于表示底层的一个TCP 连接,那么你会发现无论
是Server 端还是Client 端的IoSession 调用close()方法之后,TCP 连接虽然显示关闭,
但
主线程仍然在运行,也就是JVM 并未退出,这是因为IoSession 的close()仅仅是关闭了TCP
的连接通道,并没有关闭Server 端、Client 端的程序。你需要调用IoService 的dispose()
方法停止Server 端、Client 端。
_______________________________________________________________________________
(5.)IoSessionConfig:
这个方法用于指定此次会话的配置,它有如下常用的方法:
A. void setReadBufferSize(int size):
这个方法设置读取缓冲的字节数,但一般不需要调用这个方法,因为IoProcessor 会自动调
整缓冲的大小。你可以调用setMinReadBufferSize()、setMaxReadBufferSize()方法,这
样无论IoProcessor 无论如何自动调整,都会在你指定的区间。
B. void setIdleTime(IdleStatus status,int idleTime):
这个方法设置关联在通道上的读、写或者是读写事件在指定时间内未发生,该通道就进入空
闲状态。一旦调用这个方法,则每隔idleTime 都会回调过滤器、IoHandler 中的
sessionIdle()
方法。
C. void setWriteTimeout(int time)
:
这个方法设置写操作的超时时间。
D. void setUseReadOperation(boolean useReadOperation):
这个方法设置IoSession 的read()方法是否可用,默认是false。
_______________________________________________________________________________
(6.)IoHandler:
这个接口是你编写业务逻辑的地方,从上面的示例代码可以看出,读取数据、发送数据基本
都在这个接口总完成,这个实例是绑定到IoService 上的,有且只有一个实例(没有给一个
IoService 注入一个IoHandler 实例会抛出异常)。它有如下几个方法:
A. void sessionCreated(IoSession session):
这个方法当一个Session 对象被创建的时候被调用。对于TCP 连接来说,连接被接受的时候
调用,但要注意此时TCP 连接并未建立,此方法仅代表字面含义,也就是连接的对象
IoSession 被创建完毕的时候,回调这个方法。
对于UDP 来说,当有数据包收到的时候回调这个方法,因为UDP 是无连接的。
剩余39页未读,继续阅读
顾北L
- 粉丝: 6
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功