接着Mina源码阅读笔记(四)—Mina的连接IoConnector1,,我们继续:
AbstractIoAcceptor:
001 |
package org.apache.mina.core.rewrite.service; |
003 |
import java.io.IOException; |
004 |
import java.net.SocketAddress; |
005 |
import java.util.ArrayList; |
006 |
import java.util.Collections; |
007 |
import java.util.HashSet; |
008 |
import java.util.List; |
009 |
import java.util.Set; |
010 |
import java.util.concurrent.Executor; |
012 |
public abstract class AbstractIoAcceptor extends AbstractIoService implements |
015 |
private final List<SocketAddress>
defaultLocalAddresses = new ArrayList<SocketAddress>(); |
017 |
private final List<SocketAddress>
unmodifiableDeffaultLocalAddresses = Collections |
018 |
.unmodifiableList(defaultLocalAddresses); |
020 |
private final Set<SocketAddress>
boundAddresses = new HashSet<SocketAddress>(); |
022 |
private boolean disconnectOnUnbind
= true; |
024 |
/**
这里不是很明白,为什么要用protected 而 不是private */ |
025 |
protected final Object
bindLock = new Object(); |
028 |
*
注意这个构造方法是一定要写的,否则编译不通过:抽象类继承时候,构造方法都要写,而且必须包含super |
034 |
protected AbstractIoAcceptor(Object
param, Executor executor) { |
035 |
super(param,
executor); |
036 |
defaultLocalAddresses.add(null); |
040 |
public SocketAddress
getLocalAddress() { |
042 |
Set<SocketAddress>
localAddresses = getLocalAddresses(); |
043 |
if (localAddresses.isEmpty())
{ |
046 |
return localAddresses.iterator().next(); |
050 |
public final Set<SocketAddress>
getLocalAddresses() { |
051 |
Set<SocketAddress>
localAddresses = new HashSet<SocketAddress>(); |
052 |
synchronized (boundAddresses)
{ |
053 |
localAddresses.addAll(boundAddresses); |
055 |
return localAddresses; |
059 |
public void bind(SocketAddress
localAddress) throws IOException
{ |
060 |
//
TODO Auto-generated method stub |
065 |
public void bind(Iterable<? extends SocketAddress>
localAddresses) |
067 |
//
TODO isDisposing() |
069 |
if (localAddresses
== null)
{ |
070 |
throw new IllegalArgumentException("localAddresses"); |
073 |
List<SocketAddress>
localAddressesCopy = new ArrayList<SocketAddress>(); |
075 |
for (SocketAddress
a : localAddresses) { |
076 |
//
TODO check address type |
077 |
localAddressesCopy.add(a); |
080 |
if (localAddressesCopy.isEmpty())
{ |
081 |
throw new IllegalArgumentException("localAddresses
is empty"); |
084 |
boolean active
= false; |
086 |
synchronized (bindLock)
{ |
087 |
synchronized (boundAddresses)
{ |
088 |
if (boundAddresses.isEmpty())
{ |
093 |
/**
implement in abstractIoService */ |
094 |
if (getHandler()
== null)
{ |
095 |
throw new IllegalArgumentException("handler
is not set"); |
099 |
Set<SocketAddress>
addresses = bindInternal(localAddressesCopy); |
101 |
synchronized (boundAddresses)
{ |
102 |
boundAddresses.addAll(addresses); |
104 |
} catch (IOException
e) { |
106 |
} catch (RuntimeException
e) { |
108 |
} catch (Throwable
e) { |
109 |
throw new RuntimeException("Filed
ti bind"); |
117 |
protected abstract Set<SocketAddress>
bindInternal( |
118 |
List<? extends SocketAddress>
localAddress) throws Exception; |
121 |
public void unbind(SocketAddress
localAddress) { |
122 |
//
TODO Auto-generated method stub |
polling:
01 |
package org.apache.mina.core.rewrite.polling; |
03 |
import java.net.SocketAddress; |
04 |
import java.nio.channels.ServerSocketChannel; |
05 |
import java.util.List; |
07 |
import java.util.concurrent.Executor; |
08 |
import java.util.concurrent.Semaphore; |
09 |
import java.util.concurrent.atomic.AtomicReference; |
11 |
import org.apache.mina.core.rewrite.service.AbstractIoAcceptor; |
13 |
public abstract class AbstractPollingIoAcceptor extends AbstractIoAcceptor
{ |
15 |
private final Semaphore
lock = new Semaphore(1); |
17 |
private volatile boolean selectable; |
19 |
private AtomicReference<Acceptor>
acceptorRef = new AtomicReference<Acceptor>(); |
22 |
*
define the num of sockets that can wait to be accepted. |
24 |
protected int backlog
= 50; |
32 |
protected AbstractPollingIoAcceptor(Object
param, Executor executor) { |
33 |
super(param,
executor); |
34 |
//
TODO Auto-generated constructor stub |
38 |
*
init the polling system. will be called at construction time |
42 |
protected abstract void init() throws Exception; |
44 |
protected abstract void destory() throws Exception; |
46 |
protected abstract int select() throws Exception; |
48 |
protected abstract ServerSocketChannel
open(SocketAddress localAddress) throws Exception; |
51 |
protected Set<SocketAddress>
bindInternal( |
52 |
List<? extends SocketAddress>
localAddress) throws Exception
{ |
65 |
*
this class is called by startupAcceptor() method it's a thread accepting |
66 |
*
incoming connections from client |
71 |
private class Acceptor implements Runnable
{ |
74 |
assert (acceptorRef.get()
== this); |
82 |
int selected
= select(); |
84 |
//
nHandles+=registerHandles(); |
87 |
acceptorRef.set(null); |
90 |
} catch (Exception
e) { |
好了最后看NioSoeketAcceptor:
001 |
package org.apache.mina.rewrite.transport.socket.nio; |
003 |
import java.net.InetSocketAddress; |
004 |
import java.net.ServerSocket; |
005 |
import java.net.SocketAddress; |
006 |
import java.nio.channels.SelectionKey; |
007 |
import java.nio.channels.Selector; |
008 |
import java.nio.channels.ServerSocketChannel; |
009 |
import java.util.concurrent.Executor; |
011 |
import org.apache.mina.core.rewrite.polling.AbstractPollingIoAcceptor; |
012 |
import org.apache.mina.rewrite.transport.socket.SocketAcceptor; |
014 |
public final class NioSocketAcceptor extends AbstractPollingIoAcceptor |
015 |
implements SocketAcceptor
{ |
017 |
private volatile Selector
selector; |
019 |
protected NioSocketAcceptor(Object
param, Executor executor) { |
020 |
super(param,
executor); |
021 |
//
TODO Auto-generated constructor stub |
025 |
public int getManagedSessionCount()
{ |
026 |
//
TODO Auto-generated method stub |
031 |
*
这个方法继承自AbstractIoAcceptor |
033 |
*
The type NioSocketAcceptor must implement the inherited abstract method |
034 |
*
SocketAcceptor.getLocalAddress() to override |
035 |
*
AbstractIoAcceptor.getLocalAddress() |
038 |
public InetSocketAddress
getLocalAddress() { |
039 |
//
TODO Auto-generated method stub |
044 |
public void setDefaultLocalAddress(InetSocketAddress
localAddress) { |
045 |
//
TODO Auto-generated method stub |
050 |
public boolean isReuseAddress()
{ |
051 |
//
TODO Auto-generated method stub |
056 |
protected void init() throws Exception
{ |
057 |
selector
= Selector.open(); |
061 |
protected void destory() throws Exception
{ |
062 |
if (selector
!= null)
{ |
068 |
protected int select() throws Exception
{ |
069 |
return selector.select(); |
073 |
protected void dispose0() throws Exception
{ |
074 |
//
TODO Auto-generated method stub |
078 |
protected ServerSocketChannel
open(SocketAddress localAddress) |
080 |
ServerSocketChannel
channel =ServerSocketChannel.open(); |
082 |
boolean success=false; |
085 |
channel.configureBlocking(false); |
087 |
ServerSocket
socket=channel.socket(); |
089 |
socket.setReuseAddress(isReuseAddress()); |
091 |
socket.bind(localAddress); |
093 |
channel.register(selector,
SelectionKey.OP_ACCEPT); |
105 |
public boolean isActive()
{ |
106 |
//
TODO Auto-generated method stub |
------------------------------------------------------
到此为止将连接部分都写完了,在连接部分还有些零碎的东西,比如handler、polling,这些都只是稍稍提了一下,具体后面会在介绍其他部分是肯定还会碰上,我还是想把重心放在最主要的部分去写,下一篇应该要写到session了。
- Mina源码阅读笔记(一)-整体解读
今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者类的方法.我倒是想从mina源码的结构和功能上对这个框架进行剖析.源码的阅 ...
- Mina源码阅读笔记(二)- IoBuffer的封装
在阅读IoBuffer源码之前,我们先看Mina对IoBuffer的描述:A byte buffer used by MINA applications. This is a replacement ...
- Mina源码阅读笔记(七)—Mina的拦截器FilterChain
Filter我们很熟悉,在Mina中,filter chain的用法也类似于Servlet的filters,这种拦截器的设计思想能够狠轻松的帮助我们实现对资源的统一处理.我们先大致连接下mina中的f ...
- Mina源码阅读笔记(四)—Mina的连接IoConnector1
上一篇写的是IoAcceptor是服务器端的接收代码,今天要写的是IoConnector,是客户端的连接器.在昨天,我们还留下一些问题没有解决,这些问题今天同样会产生,但是都要等到讲到session的 ...
- Mina源码阅读笔记(三)-Mina的连接IoAccpetor
其实在mina的源码中,IoService可以总结成五部分service责任.Processor线程处理.handler处理器.接收器和连接器,分别对应着IoService.IoProcessor.I ...
- Mina源码阅读笔记(六)—Mina异步IO的实现IoFuture
IoFuture是和IoSession紧密相连的一个类,在官网上并没有对它的描述,因为它一般不会显示的拿出来用,权当是一个工具类被session所使用.当然在作用上,这个系列可并不简单,我们先看源码的 ...
- Mina源码阅读笔记(五)—Mina对连接的操作IoSession
IoSession是Mina管理两端的一个重要部分,也是Mina的核心,Session具有了生命周期的概念,它的生命周期和连接时紧密相关的,这点在后面的介绍中会涉及.另外,好像hibernate中也有 ...
- Werkzeug源码阅读笔记(四)
今天主要讲一下werkzeug中的routing模块.这个模块是werkzeug中的重点模块,Flask中的路由相关的操作使用的都是这个模块 routing模块的用法 在讲解模块的源码之前,先讲讲这个 ...
- 源码阅读笔记 - 1 MSVC2015中的std::sort
大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
随机推荐
- Spark技术内幕: Shuffle详解(一)
通过上面一系列文章,我们知道在集群启动时,在Standalone模式下,Worker会向Master注册,使得Master可以感知进而管理整个集群:Master通过借助ZK,可以简单的实现HA:而应用 ...
- Hive-RCFile文件存储格式
在新建Hive表时,可以使用stored as rcfile来指定hive文件的存储方式为RCFile. 一.RCFile文件结构 下图是一个RCFile的文件结构形式. 从上图可以看出: 1)一张表 ...
- 剑指Offer——简述堆和栈的区别
剑指Offer--简述堆和栈的区别 堆(Heap) Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建: Java虚拟机规范描述:所有的对象实例及数组都要在堆上分配: Java堆可以处于物理 ...
- [struts2学习笔记] 第二节 使用Maven搞定管理和构造Struts 2 Web应用程序的七个步骤
本文地址:http://blog.csdn.net/sushengmiyan/article/details/40303897 官方文档:http://struts.apache.org/releas ...
- Android简易实战教程--第十三话《短信备份和还原~三》
之前写过短信备份的小案例,哪里仅仅是虚拟了几条短信信息.本篇封装一个业务类,且直接通过内容提供者,访问本系统的短信信息,再提供对外接口.如果想要短信备份和短信还原,直接复制这段代码即可.对于您调用这个 ...
- scala学习笔记4(apply方法)
class ApplyTest{ def apply() = "This apply is in class" def test{ println("test" ...
- redhat安装vsftpd
一个小问题 rpm -qa|ftp 但是出现3个ftp 只安装了一个 关于网卡ip 首先,我们看到 网卡上面有个x 说明网络是有问题的 我们双击,看到 我们先把connected和connect at ...
- Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)
ObjectInputStream和ObjectOutputStream的作用是对基本数据和对象进行序列化操作支持.创建文件输出流对应的ObjectOutputStream对象,该ObjectOutp ...
- Leetcode_13_Roman to Integer
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41486885 通过本文你可能学到的知识如下: (1)理解本 ...
- 视音频编解码学习工程:JPEG分析器
=====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...