- 浏览: 121304 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
萨琳娜啊:
Java读源码之Netty深入剖析网盘地址:https://p ...
Netty 源码阅读学习 -
小灯笼:
Netty源码剖析视频教程网盘地址:https://pan.b ...
Netty 源码阅读学习 -
白天看黑夜:
Apache Mina Server 2.0 中文参考手册(带 ...
Apache MINA (2) Hello World! -
smart152829:
很不错的文章,最近看了看了夜行侠老师讲的Netty深入浅出源码 ...
Netty 源码阅读学习 -
liaohb:
为之疯狂的颜值,陶醉天年。
nio Selector 阻塞 唤醒 原理
上一篇博客Apache MINA (2) Hello World! 以一个例子实现了mina客户端和服务端的通讯,现在通过源码来了解建立连接和通讯的过程(基于tcp/ip的实现)。
服务端通过创建一个NioSocketAcceptor来接受请求,客户端通过创建NioSocketConnector来连接服务端并发送请求,从整体的体系结构来看二者的关系。
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类
public NioSocketAcceptor() { super(new DefaultSocketSessionConfig(), NioProcessor.class); ((DefaultSocketSessionConfig) getSessionConfig()).init( }
... ... listeners = new IoServiceListenerSupport(this); listeners.add(serviceActivationListener); ... ...AbstractIoService负责初始化了IoServiceListenerSupport监听当前服务相关的事件
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方法,
...... 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图如下:
小结:
通过解析 NioSocketAcceptor的构造方法,bind()等代码大概了解了mina服务端初始化相关的一些信息。
NioSocketAcceptor:主要负责实现nio操作相关的实现如accept(),open(),select()等方法
AbstractIoService:主要负责初始化IoServiceListenerSupport和IoServiceListener
SimpleIoProcessorPool:初始化了一个无界线程池executor,初始化了cpu+1个NioProcessor绑定到executor中
AbstractPollingIoAcceptor:主要负责维护和绑定端口,打开selector通道,初始化内部线程类Acceptor作为服务主线程。
接下来开始了解mina接收处理请求的过程>> Apache MINA (4) 接收处理请求的过程
发表评论
-
Disruptor 学习笔记
2015-04-12 23:06 3585Disruptor 是什么 Disruptor ... -
Zookeeper 笔记
2015-04-12 22:42 1254ZooKeeper ZooKeeper是一 ... -
java jvm笔记
2014-09-26 16:41 01. jconsole 设置环境变量:export DI ... -
Netty 源码阅读学习
2014-09-18 21:40 11112背景 最忌工作中接触到Netty相关应用场景,之 ... -
ThreadLocal
2014-08-05 21:08 534ThreadLocal作用 ThreadLocal提供了 ... -
ReentrantLock AQS 源码阅读笔记
2014-08-05 21:06 1209ReentrantLock是JDK1.5引入的,它拥有与sy ... -
Java 内存可见性与volatile
2014-06-28 23:24 2698在多核系统中,处理 ... -
ubuntu 搭建开发环境
2014-05-04 14:37 0win7 硬盘安装方法: http://diybbs.z ... -
nio Selector 阻塞 唤醒 原理
2014-03-18 16:18 25223Selector:java nio无阻塞io实现的关键。阻 ... -
java nio Buffer 学习笔记
2014-03-17 14:54 1548Buffer 是一个对象, 它 ... -
java nio channel 学习笔记
2014-03-10 23:20 1426Channel直译就是通道的意思,通道表示对数据源头和数据 ... -
java 动态代理
2013-09-25 23:29 1077java的动态代理可以动态的创建并动态的处理所代理的方法调 ... -
java 泛型通配符
2013-09-25 23:25 950泛型是Java SE 1.5的新特性,泛型的本质是参数化类 ... -
java堆和栈
2013-09-23 22:58 936Java把内存划分成两种 ... -
Java nio 基础概念笔记
2012-12-27 12:09 1209Channel: ServerSocketChanne ... -
Apache MINA (4) 接收处理请求的过程
2012-12-23 23:50 8578上一篇博客 Apache MINA (3) NioSocket ... -
Apache MINA (2) Hello World!
2012-07-26 23:40 5213了解完Apach MINA的一些基本概念Apache MINA ... -
Apache MINA (1) 简介
2012-07-26 22:14 2434简介: Apache MINA(Mult ... -
BufferedInputStream 源码学习笔记
2012-06-17 19:01 9607BufferedInputStream 是一个带有内存缓冲的 ... -
java 反射内部类
2011-01-17 22:05 4552内部类的初始化同一般类的初始化基本相同,只是内部类的类名全称有 ...
相关推荐
当有新的连接建立时,`IoHandler`的`sessionCreated()`方法会被调用,此时可以初始化一些必要的资源。接着,`messageReceived()`方法会在接收到客户端数据时被调用,这里可以处理接收到的信息,并做出响应。例如,在...
下面是一个简单的 TCP 服务器示例,展示了如何初始化 IoService(在这里是 IoAcceptor)以及配置其基本属性: ```java public class MyServer { public static void main(String[] args) { IoAcceptor acceptor =...
客户端程序则需要初始化IoConnector,配置连接参数,如服务器地址和端口,然后建立连接并实现IoHandler以处理与服务端的数据交互。 #### 第五步. 长连接VS短连接 长连接是指连接一旦建立,就会保持一段时间,期间...
- **MainServer.java**:启动服务器的主要类,用于初始化和配置服务器。 ```java public class MainServer { public static void main(String[] args) throws Exception { NioSocketAcceptor acceptor = new ...
1. **初始化IoService**:创建IoAcceptor实例,如NioSocketAcceptor,它与具体的协议无关,但适用于TCP服务。配置读缓冲区大小、空闲超时时间,并绑定到指定的端口。 ```java public class MyServer { public ...
以下是一个简单的服务器初始化代码: ```java public class MyServer { public static void main(String[] args) { IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getSessionConfig()....
1. **初始化**:设置服务器配置,如绑定的端口号,I/O处理器等。 2. **创建服务端**:使用`ServerBootstrap`创建并配置`NioSocketAcceptor`,然后绑定到指定端口。 3. **实现IoHandler**:编写`IoHandler`的实现,...
1. 初始化IoAcceptor:Mina服务端首先需要创建一个IoAcceptor实例,用于监听特定端口的连接请求。通常使用NioSocketAcceptor,它基于Java的非阻塞I/O(NIO)模型,可以高效地处理大量并发连接。 2. 创建...
1. **初始化IoAcceptor**:创建一个IoAcceptor实例,它负责监听特定端口并接受新的连接。例如,对于TCP协议,我们可以使用`NioSocketAcceptor`。 2. **设置IoHandler**:将实现IoHandler接口的类绑定到IoAcceptor,...
在JavaDemo1中,可能会有如下的服务端初始化代码: ```java public class MinaServer { public static void main(String[] args) throws Exception { // 创建IoAcceptor对象,指定TCP协议 NioSocketAcceptor ...
// 初始化Acceptor,默认线程数量为CPU数量+2 NioSocketAcceptor acceptor = new NioSocketAcceptor(5); // 创建线程池 Executor threadPool = Executors.newFixedThreadPool(1500); // 添加过滤器到Acceptor ...
1. **初始化IoAcceptor**: IoAcceptor是Mina中的核心组件,用于监听和接受新的客户端连接。你可以使用NioSocketAcceptor或OioSocketAcceptor,前者基于Java NIO,后者基于传统的阻塞I/O。通常,NioSocketAcceptor更...
3. 创建一个`SessionInitializer`,用于初始化新建立的会话。这里可以设置处理器等信息。 4. 调用`IoConnector`的`connect`方法,指定服务器的地址和端口,开始连接。 5. 当连接成功后,可以通过`IoSession`对象...
- **初始化服务端**:创建一个ServerBootstrap实例,配置线程池、协议处理器工厂、NioSocketAcceptor等,然后绑定监听端口。 - **定义过滤器**:编写自定义的过滤器类,实现IoFilter接口,处理数据的读写和事件处理...
《Mina入门程序详解》 ...通过学习和实践Mina入门程序,我们可以了解如何初始化和配置IoAcceptor,设置Handler和Filter,以及如何处理客户端的连接和消息。这将为你的IT职业生涯打开一扇通向网络编程新世界的大门。
5. **Bootstrap**: 用于初始化服务端或客户端的配置对象,包括设置传输协议、处理器链、线程模型等。 6. **NioSocketAcceptor/NioSocketConnector**: 分别用于创建服务器端监听和客户端连接的实现。NIO(非阻塞I/O...
在上述代码中,可以看到如何使用MINA框架初始化一个服务器: 1. `NioSocketAcceptor` 是MINA中的一个核心类,它用于创建一个监听特定端口的TCP服务器。在这个例子中,`acceptor` 被创建并配置为监听指定的端口...
1. Server端:服务器启动类,初始化Acceptor并绑定监听端口。在接收到连接请求后,会创建一个新的Session,并添加一系列的过滤器。服务器还需要处理Session的打开、关闭、异常等事件,以及通过Session进行数据传输。...