设为首页 收藏本站
查看: 806|回复: 0

[经验分享] Apache MINA (3) NioSocketAcceptor初始化

[复制链接]

尚未签到

发表于 2017-1-7 09:24:25 | 显示全部楼层 |阅读模式
  上一篇博客Apache MINA (2) Hello World! 以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现)。
  服务端通过创建一个NioSocketAcceptor来接受请求,客户端通过创建NioSocketConnector来连接服务端并发送请求,从整体的体系结构来看二者的关系。
  
DSC0000.png
 IoService是对于服务器端接受连接和客户端发起连接两类行为的一个抽象。IoServer用来执行真正的 I/O 操作,以及管理 I/O 会话。两个子接口为IoAcceptor和IoConnector。IoAcceptor用来接受连接,与客户端进行通讯。IoConnector用来发起连接,与服务端进行通讯。IoAcceptor和IoConnector都分别有基于TCP/IP协议协议,UDP/IP协议以及虚拟机管道通讯的子接口。Hello World例子里面实现的是基于TCP/IP协议的通讯,用了mina默认的实现类NioSocketAcceptor和NioSocketConnector。
  首先从服务端的NioSocketAcceptor开始:
  1. NioSocketAcceptor的父类为AbstractPollingIoAcceptor,很多实现是在父类中实现的。在构造此类的时候,同时也构造了NioProcessor类

NioSocketAcceptor

public NioSocketAcceptor() {
super(new DefaultSocketSessionConfig(), NioProcessor.class);
((DefaultSocketSessionConfig) getSessionConfig()).init(
}


AbstractIoService

... ...
listeners = new IoServiceListenerSupport(this);
listeners.add(serviceActivationListener);
... ...
 AbstractIoService负责初始化了IoServiceListenerSupport监听当前服务相关的事件




AbstractPollingIoAcceptor

protected AbstractPollingIoAcceptor(IoSessionConfig sessionConfig,
Class<? extends IoProcessor<S>> processorClass) {
this(sessionConfig, null, new SimpleIoProcessorPool<S>(processorClass),
true);
}
  SimpleIoProcessorPool

private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;
......
public SimpleIoProcessorPool(Class<? extends IoProcessor<S>> processorType) {
this(processorType, null, DEFAULT_SIZE);
}
  初始化NioProcessor,个数为cpu个数+1,为每个IoProcessor初始化一个默认的Excutor
  this.executor = Executors.newCachedThreadPool();
  初始化cpu+1个放到private final IoProcessor<S>[] pool 中,用来处理NioSession,所以S为NioSession

public final class NioProcessor extends AbstractPollingIoProcessor<NioSession>…
  2. 初始化完SimpleIoProcessorPool,回到AbstractPollingIoAcceptor的构造方法中,调用NioSocketAcceptor中的init()方法打开selector通道,完成NioSocketAcceptor的构造。
  3. 然后在上一篇Hello World的例子中设置了SocketSessionConfig的readBufferSize;
  接收数据的过滤器,例子中设置的是TextLineCodecFactory(按照行一行为一个单位读取数据);
  实现IoHandlerAdapter来处理客户的请求。
  4. 最后执行acceptor.bind(new InetSocketAddress(SERVER_PORT)),指定服务提供绑定的端口,同时执行AbstractPollingIoAcceptor中的bindInternal方法,

调用startupAcceptor()负责初始化内部线程类Acceptor,Acceptor主要负责轮询处理注册过连接事件的请求建立起连接,即整个监听的主线程,Acceptor会开一个Selector,用来监听NIO中的ACCEPT事件,调用NioSocketAcceptor中的open()方法来打开NIO的socketChinal

......
ServerSocketChannel channel = ServerSocketChannel.open();
......
然后配制socket的一些基本属性,并注册此事件是可连接的事件

    // This is a non blocking socket channel
channel.configureBlocking(false);
// Configure the server socket,
ServerSocket socket = channel.socket();
// Set the reuseAddress flag accordingly with the setting
socket.setReuseAddress(isReuseAddress());
// and bind.
socket.bind(localAddress, getBacklog());
// Register the channel within the selector for ACCEPT event
channel.register(selector, SelectionKey.OP_ACCEPT);

  当接收到请求时调用accept()方法法处理接收连接,把SocektChannel绑定到NioSession中

    @Override
protected NioSession accept(IoProcessor<NioSession> processor,
ServerSocketChannel handle) throws Exception {
SelectionKey key = handle.keyFor(selector);
if ((key == null) || (!key.isValid()) || (!key.isAcceptable()) ) {
return null;
}
// accept the connection from the client
SocketChannel ch = handle.accept();
if (ch == null) {
return null;
}
return new NioSocketSession(this, processor, ch);

  5. 绑定完成后唤醒NIO的selector开始接收请求

selector.wakeup();
  初始化过程涉及到的主要类和接口UML图如下:
  
DSC0001.png
  小结
  通过解析 NioSocketAcceptor的构造方法,bind()等代码大概了解了mina服务端初始化相关的一些信息。
  NioSocketAcceptor:主要负责实现nio操作相关的实现如accept(),open(),select()等方法
  AbstractIoService:主要负责初始化IoServiceListenerSupport和IoServiceListener
  SimpleIoProcessorPool:初始化了一个无界线程池executor,初始化了cpu+1个NioProcessor绑定到executor中
  AbstractPollingIoAcceptor:主要负责维护和绑定端口,打开selector通道,初始化内部线程类Acceptor作为服务主线程。
  接下来开始了解mina接收处理请求的过程>> Apache MINA (4) 接收处理请求的过程

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-324937-1-1.html 上篇帖子: apache oro使用注意细节(并发问题) 下篇帖子: apache + mod_cluster + jboss 配置http压缩
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表