Socket通信封装MIna框架--含羞代放
2019-08-26 06:16:08来源:博客园 阅读 ()
Socket通信封装MIna框架--含羞代放
目录
- 核心类
- 各个击破
- IoService
- IoFilter
- IoHandler
- 总结
- # 加入战队
- 微信公众号
Mina异步IO使用的Java底层JNI框架,Mina提供服务端和客户端,将我们的业务解耦开发.真正做到高内聚低耦合的思想
核心类
IoService :Mina中将服务端和客户端都看成是服务,这里提供统一接口IoService,这个接口的作用就是用来处理套接字机制。也正是IoService来监听消息返回消息这些步骤,
可以说IoService就是我们Mina中核心IoProcessor:这个接口在另一个线程上,负责检查是否有数据在通道上读写,也就是说它也拥有自己的Selector,这是与我们使用JAVA NIO 编码时的一个不同之处,通常在JAVA NIO 编码中,我们都是使用一个Selector,也就是不区分IoService与IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在IoService 上的过滤器,并在过滤器链之后调用IoHandler
IoFilter : 定义了一些拦截器 , 和我们web中拦截器一样,用来横向拦截处理一些全局的操作(日志处理,编码处理)。其中我们必须注意的是加解密消息。
作为一个好的框架肯定是有默认的拦截器的(TextLineCodecFactory )。默认拦截器可以叫消息强制转换为String类型。毕竟String最通用IoHandler : 这个是我们处理消息的逻辑,前面的拦截器只是在接受是进行一些验证、翻译的功能。拿到数据之后我们需要做的事情就是在IoHandler中
各个击破
IoService
首先我们已服务端NioSocketAcceptor为列,看看我们的服务类之间的结构依赖关系
IoService是服务的鼻祖,无论在我们看来的服务端还是客户端都得继承它(间接继承)。在IoService中我们会定义我们消息的处理过滤器(上文的拦截器),消息处理的业务类
在上文简介中我们知道,这一步其实是IoProcessor来完成,那么IoProcessor在什么出现呢。比如Mina框架中用来创建服务端类NioSocketAcceptor。他直接继承了AbstractPollingIoAcceptor。而AbstractPollingIoAcceptor类中根据参数创建了我们需要的IoProcessor.从而我们有了IoProcessor就可以执行消息间的通信了。
所以过滤器、处理器实在我们服务启动之前配置好的。一旦启动成功就无法再修改了。我们服务端NioSocketAcceptor通过bind方法就可以绑定到指定端口上。我们这里的绑
定实现了多态绑定。我们可以绑定多个服务。
/**
* {@inheritDoc}
*/
@Override
public final void bind(Iterable<? extends SocketAddress> localAddresses) throws IOException {
if (isDisposing()) {
throw new IllegalStateException("The Accpetor disposed is being disposed.");
}
if (localAddresses == null) {
throw new IllegalArgumentException("localAddresses");
}
List<SocketAddress> localAddressesCopy = new ArrayList<>();
for (SocketAddress a : localAddresses) {
checkAddressType(a);
localAddressesCopy.add(a);
}
if (localAddressesCopy.isEmpty()) {
throw new IllegalArgumentException("localAddresses is empty.");
}
boolean activate = false;
synchronized (bindLock) {
synchronized (boundAddresses) {
if (boundAddresses.isEmpty()) {
activate = true;
}
}
if (getHandler() == null) {
throw new IllegalStateException("handler is not set.");
}
try {
Set<SocketAddress> addresses = bindInternal(localAddressesCopy);
synchronized (boundAddresses) {
boundAddresses.addAll(addresses);
}
} catch (IOException | RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeIoException("Failed to bind to: " + getLocalAddresses(), e);
}
}
if (activate) {
getListeners().fireServiceActivated();
}
}
在上面我们可以看到bind最后是去激活对应的监听器。我们一个IoServer处理一个线程中的消息。我们监听器就是监听线程内的消息。每一次的绑定都会有不同的监听器、ioSession去专门处理消息之间的通信。我们可以通过IoSession设置一些请求数据完成数据的权限验证。
- 在服务创建的时候我们正常需要设置IoSession的一些配置。通过getSessionConfig方法获取IoSessionConfig。里面设置参数常用如下:
- setReadBufferSize : 设置读取数据的缓冲区大小
- setMinReadBufferSize: 设置缓冲区最大值
- setMaxReadBufferSize: 设置缓冲区最小值
- setThroughputCalculationInterval: 设置通道计算时间 默认3s
- setIdleTime(IdleStatus status, int idleTime): status 设置是一方还是双方 , idLetime 是超过多久就会进入空闲状态
IoAcceptor acceptor=new NioSocketAcceptor();
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);
IoFilter
在IoService中有获取filter链的一个方法 DefaultIoFilterChainBuilder getFilterChain()
, 我们需要做的就是定义过滤器,然后通过该方法获取过滤链加入到请求链上。
我们自定义过滤器也很简单,只需要继承IoFilterAdapter这个类就好了。
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(
Charset.forName("UTF-8"),LineDelimeter.WINDOWS.getValue(),LineDelimiter. WINDOWS.getValue()))
);
TextLineCodecFactory 这个类是Mina提供的编解码工厂,这个工厂的特性是以换行符'\r\n'为结束通信的标志。也就是说如果我们传递消息没有换行符,另外一段会继续
接受消息知道接受到'\r\n'才会接受,并把接受到的消息通过编解码器转到IoHandler层供业务层处理。(这里博主被坑在这里了)
IoHandler
- 到了这一步,我们的通信基本就已经完成了。剩下的事情已经和Mina基本没多大关联了。我们将在这里处理业务逻辑,使用到的就是Handler提供的接收消息和发送消息两个功能。
这里我们需要注意的是Handler提供messageReceived
和messageSent
并不是字面意思。前者就是消息的接受,但是后者并不是消息的发送。我们常用的发送消息是session.write方法。
总结
今天我们了解了Mina工作的流程,主要就是IoFilter和IoHandler实现消息的通信 。 千里之行始于足下,一点一点的进步。下面贴出一份总结的图谱帮助我们理解Mina流程
加入战队
# 加入战队
微信公众号
原文链接:https://www.cnblogs.com/zhangxinhua/p/11388919.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring Boot 开发集成 WebSocket,实现私有即时通信系统 2020-05-24
- SpringCloud异常处理统一封装我来做-使用篇 2020-05-23
- JAVA连载117-反射的应用与打破封装新 2020-05-23
- 简版在线聊天Websocket 2020-05-19
- 错题记录——关于Java中private的用法(类与封装) 2020-05-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash