返回顶部
首页 > 资讯 > 后端开发 > Python >Apache MINA (3) NioS
  • 505
分享到

Apache MINA (3) NioS

ApacheMINANioS 2023-01-31 06:01:24 505人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

上一篇博客ApacheMINA(2)HelloWorld!以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现)。服务端通过创建一个NIOSocketAcceptor来接受请求,客户端

上一篇博客ApacheMINA(2)HelloWorld!以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现)。

服务端通过创建一个NIOSocketAcceptor来接受请求,客户端通过创建NiOSocketConnector来连接服务端并发送请求,从整体的体系结构来看二者的关系。

ioService是对于服务器端接受连接和客户端发起连接两类行为的一个抽象。IoServer用来执行真正的I/O操作,以及管理I/O会话。两个子接口为IoAcceptor和ioconnector。IoAcceptor用来接受连接,与客户端进行通讯。IoConnector用来发起连接,与服务端进行通讯。IoAcceptor和IoConnector都分别有基于TCP/IP协议协议,UDP/IP协议以及虚拟机管道通讯的子接口。HelloWorld例子里面实现的是基于TCP/IP协议的通讯,用了mina默认的实现类NioSocketAcceptor和NioSocketConnector。

首先从服务端的NioSocketAcceptor开始:

1.NioSocketAcceptor的父类为AbstractPollingIoAcceptor,很多实现是在父类中实现的。在构造此类的时候,同时也构造了NioProcessor类

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

Java代码

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

Java代码

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个放到privatefinalIoProcessor<S>[]pool中,用来处理NioSession,所以S为NioSession

Java代码
public final class NioProcessor extends AbstractPollingIoProcessor<NioSession>…

2.初始化完SimpleIoProcessorPool,回到AbstractPollingIoAcceptor的构造方法中,调用NioSocketAcceptor中的init()方法打开selector通道,完成NioSocketAcceptor的构造。

3.然后在上一篇HelloWorld的例子中设置了SocketSessionConfig的readBufferSize;

接收数据的过滤器,例子中设置的是TextLineCodecFactory(按照行一行为一个单位读取数据);

实现IoHandlerAdapter来处理客户的请求。

4.最后执行acceptor.bind(newInetSocketAddress(SERVER_PORT)),指定服务提供绑定的端口,同时执行AbstractPollingIoAcceptor中的bindInternal方法,

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

然后配制socket的一些基本属性,并注册此事件是可连接的事件

Java代码
// 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中

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

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

Java代码
selector.wakeup();

小结:

通过解析NioSocketAcceptor的构造方法,bind()等代码大概了解了mina服务端初始化相关的一些信息,同时涉及了mina框架相关的IoProcessorIoSessionIoServiceListener等,在下一篇文章中会再做进一步的分析接收到最终的处理请求的过程。

--结束END--

本文标题: Apache MINA (3) NioS

本文链接: https://lsjlt.com/news/189733.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Apache MINA (3) NioS
    上一篇博客ApacheMINA(2)HelloWorld!以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现)。服务端通过创建一个NioSocketAcceptor来接受请求,客户端...
    99+
    2023-01-31
    Apache MINA NioS
  • Apache的MINA有什么用
    这篇文章将为大家详细讲解有关Apache的MINA有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Apache的MINA是一个被用来构建高性能和高可伸缩性应用程序的网络应用框架,它提供了一套统一的建...
    99+
    2023-06-17
  • Apache MINA中怎么进行对象传输
    Apache MINA中怎么进行对象传输,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。利用Apache MINA来传递对象,这对了MINA来说非常容易,并且这也是Java网络编...
    99+
    2023-06-17
  • Apache虚拟主机-3
    基于ip的虚拟主机案例:三个IP分别对应三个域名及三个目录192.168.124.222    www.abc.com     /var/www/abc192.168.124.223    tec.abc.com     /var/www/...
    99+
    2023-01-31
    虚拟主机 Apache
  • Apache日志分割的3种方法
    一、rotatelogs(apache 自带的工具)     rotatelogs是一个配合Apache管道日志功能使用的简单程序。举例:     CustomLog "|bin/rotatelogs /var/logs/logf...
    99+
    2023-01-31
    种方法 日志 Apache
  • 使用Python掌握Apache Kafka应当了解的3个库分别是哪些
    本篇文章给大家分享的是有关使用Python掌握Apache Kafka应当了解的3个库分别是哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Apache Kafka是一个分布...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作