接着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的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
随机推荐
- maven跳过单元测试的两个参数区别
maven在打包过程中需要执行单元测试.但有些时候单元测试已经通过只是想打包时,想跳过测试.maven提供了两个参数跳过测试:maven.test.skip=true 和skipTests. 例子 m ...
- Spark技术内幕:Executor分配详解
当用户应用new SparkContext后,集群就会为在Worker上分配executor,那么这个过程是什么呢?本文以Standalone的Cluster为例,详细的阐述这个过程.序列图如下: 1 ...
- LM算法与非线性最小二乘问题
摘录的一篇有关求解非线性最小二乘问题的算法--LM算法的文章,当中也加入了一些我个人在求解高精度最小二乘问题时候的一些感触: LM算法,全称为Levenberg-Marquard算法,它可用于解决非线 ...
- iOS下JS与OC互相调用(一)--UIWebView 拦截URL
最近准备把之前用UIWebView实现的JS与原生相互调用功能,用WKWebView来替换.顺便搜索整理了一下JS 与OC 交互的方式,非常之多啊.目前我已知的JS 与 OC 交互的处理方式: * 1 ...
- 学习TensorFlow,concat连接两个(或多个)通道
深度学习中,我们经常要使用的技术之一,连接连个通道作为下一个网络层的输入,那么在tensorflow怎么来实现呢? 我查看了tensorflow的API,找到了这个函数: tf.concat(conc ...
- ubuntu常用文件搜索命令
1.find find [搜索路径] [搜索关键字] 比如查找/test中文件名为t5.tmp的文件: 查找根目录下大于100M的文件 注意,这里的204800单位是块,1块=512字节 在根目录下查 ...
- 错误:One or more post-processing actions failed. Consult the OPP service log for details
今天在做采购出入库明细报表的时候,有的时候能正常打印,有的时候报 One or more post-processing actions failed. Consult the OPP serv ...
- J2EE进阶(十一)SSH框架整合常见问题汇总(二)
org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of cn. ...
- 5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算
1 Oracle基于用户的管理方案 2 DDL语句可以管理数据库的对象有:视图 索引 序列 同义词 约束 3 创建一个表,有2个条件(1 有权限:2有表空间) Oracle给你提 ...
- A*寻路算法入门(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...