Mina使用总结
第一步:编写IoService
这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立
IoService 本身既是服务端,又是客户端,我们这里编写服务端,所以使用IoAcceptor 实现
//创建一个非阻塞的server端Socket ,用NIO,初始化了服务端的TCP/IP 的基于NIO 的套接字
SocketAcceptor acceptor = new NioSocketAcceptor();
第二步:编写过滤器
IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、
数据的编码(write 方向)与解码(read 方向)等功能,其中数据的encode 与decode
是最为重要的、也是你在使用Mina 时最主要关注的地方。
过滤器IoFilter是MINA核心结构之一,它扮演着一个很重要的角色。它可以过滤所有在MINA服务和对应处理程序之间的I/O事件和请求。如果你有编写Java网络应用程序的经验,你可以放心的把他当做Servlet过滤器的一个远亲。MINA提供了很多现成的过滤器,它们通过简化典型的横切关注点,来加快网络应用程序的开发步伐。
过滤器 | 对应类 | 用法简述 |
Blacklist | 将黑名单中的远程地址的连接置为阻塞状态 | |
Buffered Write | 缓冲传出的请求,类似于BufferedOutputStream的作用 | |
Compression | 压缩所有的数据 | |
ConnectionThrottle | 连接调节器,当连接的速度快于指定的时间间隔时进行阻塞操作 | |
ErrorGenerating |
| |
Executor |
| |
FileRegionWrite |
| |
KeepAlive |
| |
Logging | 记录事件日志信息,如消息已接收,消息已发送,session打开等等 | |
MDC Injection | 将IoSession的主键属性注入线程映射表MDC中 | |
Noop | 只是用于测试并不进行实际操作的过滤器 | |
Profiler | 测量事件执行时间的过滤器,如消息已接收,消息已发送,session打开等事件的执行时间 | |
ProtocolCodec | 编码解码过滤器 | |
Proxy |
| |
Reference counting | 跟踪过滤器使用次数的过滤器 | |
RequestResponse |
| |
SessionAttributeInitializing |
| |
StreamWrite |
| |
SslFilter |
| |
WriteRequest |
|
我们处理最简单的字符串传输,Mina 已经为我们提供了TextLineCodecFactory 编解码
器工厂来对字符串进行编解码处理。
//创建接收数据的过滤器
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//设定为一行行的读取数据
ProtocolCodecFilter filter = new ProtocolCodecFilter(new TextLineCodecFactory());
chain.addLast("objectFilter",filter);
(注意:这里的过滤器其实有很多种,比如用protobuf时就要把过滤器改为StreamWriteFilter。这是因为protocol buf良好的支持字节流,所有要使用此过滤器)
第三步:编写IoHandler
//设定服务器消息处理器
acceptor.setHandler(new ClientMinaServerHandler());
而ClientMinaServerHandler类里面就是自己处理消息的具体发送与接收了
public class ClientMinaServerHandler extends IoHandlerAdapter
{
public void sessionCreated(IoSession session) {
............... }
public void sessionOpened(IoSession session) throws Exception {
.................
}
public void messageReceived(IoSession session, Object message)
throws Exception {
}
.................
}
第四步:绑定端口,启动服务器
//服务器绑定的端口
int bindPort = 8880;//自己定义的端口号
//绑定端口,启动服务器
try {
acceptor.bind(new InetSocketAddress(bindPort));
} catch (IOException e) {
System.out.println("Mina Server start for error!"+bindPort);
e.printStackTrace();
}
System.out.println("Mina Server run done! on port:"+bindPort);
}