接着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的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
随机推荐
- Hadoop:hadoop fs、hadoop dfs与hdfs dfs命令的区别
http://blog.csdn.net/pipisorry/article/details/51340838 'Hadoop DFS'和'Hadoop FS'的区别 While exploring ...
- 06_NoSQL数据库之Redis数据库:Redis的高级应用之登录授权和主从复制
Redis高级实用特征 安全性(登录授权和登录后使用auth授权) 设置客户端连接后进行任何其他指定前需要使用的密码. 警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户 ...
- UNIX网络编程——套接字选项(setsockopt)
setsockopt的一些用法: close socket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockop ...
- CSS 控制table 滑动及调整列宽等问题总结
一. 通过css控制table y方向上滚动 html中没有滚动条,可以根据overflow属性的scroll来对table显示不完全的内容进行滚动. 只是y方向上滚动,很简单,只要设置div的hei ...
- 【一天一道LeetCode】#98. Validate Binary Search Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 基于IMX515EVK+WINCE6.0---支持PB6.0通过USB下载镜像文件
基于IMX515EVK+WINCE6.0---支持PB6.0通过USB下载镜像文件 在INAND还没有写入镜像文件之前,通过ATK工具烧录xldr.nb0和eboot.nbo到INAND中,见相关链接 ...
- Ubuntu安装JDK与环境变量配置
Ubuntu安装JDK与环境变量配置 一.getconf LONG_BIT 查看系统位数,并下载相应的jdk.我的系统是32位的,所以下载的jdk是:jdk-8u77-linux-i586.gz.并且 ...
- Linux的mount命令简介
在Linux系统中,如果要使用硬盘.光盘.软盘或MO盘等存储设备,必须先进行挂装(Mount).当存储设备挂装完成之后,就可以将其作为一个目录来进行访问了.挂装设备需要使用mount命令.执行这一命令 ...
- 小强的HTML5移动开发之路(8)——坦克大战游戏2
来自:http://blog.csdn.net/cai_xingyun/article/details/48629015 在上一篇文章中我们已经画出了自己的坦克,并且可以控制自己的坦克移动,我们继续接 ...
- (二十)即时通信的聊天气泡的实现I
Tip:通过xib和storyboard不可能将一个控件作为ImageView的子控件,只能通过代码的addSubview方法实现. 设置图片的细节:如果button比图片大(为了方便对齐),将图片设 ...