接着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的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
随机推荐
- FFmpeg源代码简单分析:avcodec_encode_video()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- 6、Android Content Provider测试
如果你的应用中使用了Content Provider来与其他应用进行数据交互,你需要对Content Provider进行测试来确保正常工作. 创建Content Provider整合测试 在Andr ...
- 手机微博(weibo.cn)模拟登录及页面解析
package com.laudandjolynn.test; import java.io.IOException; import java.io.OutputStream; import java ...
- Android必知必会-获取视频文件的截图、缩略图
背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取 ...
- Android Demo手机获取验证码
注册很多app或者网络账户的时候,经常需要手机获取验证码,来完成注册,那时年少,只是觉得手机获取验证码这件事儿很好玩,并没有关心太多,她是如何实现的,以及她背后的故事到底是什么样子的,现在小编接手的这 ...
- 使用git-flow来帮助管理git代码
对git不熟悉的我,经常把git提交搞得很乱,导致在master上有许多无用的commit,最终决定好好地看一下git的使用教程,却不小心发现了还有一个git-flow的工具可以帮助我管理好git项目 ...
- 每个程序员都应该用MBP
换笔记本的想法很久了,前段时间换工作就想看换工作之后是什么情况吧.可能工作配的笔记本就是MBP.后来发现是想多了,新工作的笔记本是Thinkpad X240, 配置完全够用了,8G内存+128G的FL ...
- 【嵌入式开发】嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11)
作者 : 万境绝尘 博客地址 : http://blog.csdn.net/shulianghan/article/details/42254237 一. 相关工具下载 嵌入式开发工具包 : -- 下 ...
- Android绘图基础Paint和Canvas介绍-android学习之旅(六十一)
canvas介绍 Paint类介绍 代码示例 效果图
- Java-IO之ByteArrayOutputStream
ByteArrayOutputSTream是字节数组输出流,继承于OutputStream.ByteArrayOutputStream中的数据被写入到一个byte数组中,缓冲区会随着数据的不断写入而自 ...