接着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的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
随机推荐
- 使用Java正则表达式去掉Double类型的数据后面多余的0
方法 /** * 使用java正则表达式去掉多余的.与0 * @param s * @return */ public static String subZeroAndDot(String s){ i ...
- 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...
- Servlet3.0注解@WebInitParam和@WebServlet
在以前的servlet中我们初始化一些参数都是配置在web.xml中的,自从servlet3.0之后给我们提供了注解@WebServlet和@WebInitParam,@WebServlet是用来配置 ...
- OpenCV特征点检测匹配图像-----添加包围盒
最终效果: 其实这个小功能非常有用,甚至加上只有给人感觉好像人脸检测,目标检测直接成了demo了,主要代码如下: // localize the object std::vector<Point ...
- 1020. Tree Traversals (25) -BFS
题目如下: Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder ...
- UNIX环境高级编程——管道和FIFO的额外属性
一个描述符能以两种方式设置成非阻塞. (1)调用open时可以指定O_NONBLOCK标志. writefd = open(FIFO1,O_WRONLY | O_NONBLOCK,0); (2)如果一 ...
- 【Unity Shaders】Reflecting Your World —— Unity3D中简单的Cubemap反射
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 海量数据挖掘MMDS week3:社交网络之社区检测:高级技巧
http://blog.csdn.net/pipisorry/article/details/49052255 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- Android利用ViewPager仿微信主界面-android学习之旅(78)
首先是介绍ViewPager这个控件 ,这个控件需要pagerAdapter作为容器来提供数据,同时pagerAdapter的数据源是View数组 效果图如下 部分代码如下,实现如下的方法 mPage ...
- 使用Libgdx开发的FlappyBird(像素鸟、疯狂的小鸟)游戏源码
本帖最后由 宋志辉 于 2014-10-21 15:06 编辑 点击进入下载地址 Flappy Bird(飞扬的小鸟)由一位来自越南河内的独立游戏开发者阮哈东开发,是一款形式简易但难度极高的休闲游戏. ...