接着Mina源码阅读笔记(四)—Mina的连接IoConnector1,,我们继续: AbstractIoAcceptor: 001 package org.apache.mina.core.rewrite.service; 002 003 import java.io.IOException; 004 import java.net.SocketAddress; 005 import java.util.ArrayList; 0
接着mina源码阅读笔记(四)—mina的连接ioconnector1,,我们继续:
AbstractIoAcceptor:
polling:
好了最后看NioSoeketAcceptor:
------------------------------------------------------
到此为止将连接部分都写完了,在连接部分还有些零碎的东西,比如
handler
、
polling
session
了。
001packageorg.apache.mina.core.rewrite.service;002003importjava.io.IOException;004importjava.net.SocketAddress;005importjava.util.ArrayList;006importjava.util.Collections;007importjava.util.HashSet;008importjava.util.List;009importjava.util.Set;010importjava.util.concurrent.Executor;011012publicabstractclassAbstractIoAcceptor extendsAbstractIoService implements013 IoAcceptor
{014015 privatefinalList
defaultLocalAddresses = newArrayList(); 016017 privatefinalList
unmodifiableDeffaultLocalAddresses = Collections 018 .unmodifiableList(defaultLocalAddresses);019020 privatefinalSet
boundAddresses = newHashSet(); 021022 privatebooleandisconnectOnUnbind
= true;023024 /**
这里不是很明白,为什么要用protected 而 不是private */025 protectedfinalObject
bindLock = newObject();026027 /**028 *
注意这个构造方法是一定要写的,否则编译不通过:抽象类继承时候,构造方法都要写,而且必须包含super029 *030 *
@param param031 *
sessionConfig032 *
@param executor033 */034 protectedAbstractIoAcceptor(Object
param, Executor executor) {035 super(param,
executor);036 defaultLocalAddresses.add(null);037 }038039 @Override040 publicSocketAddress
getLocalAddress() {041042 Set
localAddresses = getLocalAddresses(); 043 if(localAddresses.isEmpty())
{044 returnnull;045 }046 returnlocalAddresses.iterator().next();047 }048049 @Override050 publicfinalSet
getLocalAddresses() { 051 Set
localAddresses = newHashSet(); 052 synchronized(boundAddresses)
{053 localAddresses.addAll(boundAddresses);054 }055 returnlocalAddresses;056 }057058 @Override059 publicvoidbind(SocketAddress
localAddress) throwsIOException
{060 //
TODO Auto-generated method stub061062 }063064 @Override065 publicvoidbind(Iterable extendsSocketAddress>
localAddresses)066 throwsIOException
{067 //
TODO isDisposing()068069 if(localAddresses
== null)
{070 thrownewIllegalArgumentException("localAddresses");071 }072073 List
localAddressesCopy = newArrayList(); 074075 for(SocketAddress
a : localAddresses) {076 //
TODO check address type077 localAddressesCopy.add(a);078 }079080 if(localAddressesCopy.isEmpty())
{081 thrownewIllegalArgumentException("localAddresses
is empty");082 }083084 booleanactive
= false;085086 synchronized(bindLock)
{087 synchronized(boundAddresses)
{088 if(boundAddresses.isEmpty())
{089 active
= true;090 }091 }092 }093 /**
implement in abstractIoService */094 if(getHandler()
== null)
{095 thrownewIllegalArgumentException("handler
is not set");096 }097098 try{099 Set
addresses = bindInternal(localAddressesCopy); 100101 synchronized(boundAddresses)
{102 boundAddresses.addAll(addresses);103 }104 } catch(IOException
e) {105 throwe;106 } catch(RuntimeException
e) {107 throwe;108 } catch(Throwable
e) {109 thrownewRuntimeException("Filed
ti bind");110 }111 112 if(active){113 //do
sth114 }115 }116117 protectedabstractSet
bindInternal( 118 List extendsSocketAddress>
localAddress) throwsException;119120 @Override121 publicvoidunbind(SocketAddress
localAddress) {122 //
TODO Auto-generated method stub123 124124 }125}01packageorg.apache.mina.core.rewrite.polling;0203importjava.net.SocketAddress;04importjava.nio.channels.ServerSocketChannel;05importjava.util.List;06importjava.util.Set;07importjava.util.concurrent.Executor;08importjava.util.concurrent.Semaphore;09importjava.util.concurrent.atomic.AtomicReference;1011importorg.apache.mina.core.rewrite.service.AbstractIoAcceptor;1213publicabstractclassAbstractPollingIoAcceptor extendsAbstractIoAcceptor
{1415 privatefinalSemaphore
lock = newSemaphore(1);1617 privatevolatilebooleanselectable;1819 privateAtomicReference
acceptorRef = newAtomicReference(); 2021 /**22 *
define the num of sockets that can wait to be accepted.23 */24 protectedintbacklog
= 50;2526 /**27 *
一样的,这个构造方法也要写28 *29 *
@param param30 *
@param executor31 */32 protectedAbstractPollingIoAcceptor(Object
param, Executor executor) {33 super(param,
executor);34 //
TODO Auto-generated constructor stub35 }3637 /**38 *
init the polling system. will be called at construction time39 *40 *
@throws Exception41 */42 protectedabstractvoidinit() throwsException;4344 protectedabstractvoiddestory() throwsException;4546 protectedabstractintselect() throwsException;47 /**这里有点儿变动*/48 protectedabstractServerSocketChannel
open(SocketAddress localAddress) throwsException;4950 @Override51 protectedSet
bindInternal( 52 List extendsSocketAddress>
localAddress) throwsException
{53 //
...54 try{55 lock.acquire();56 Thread.sleep(10);57 } finally{58 lock.release();59 }60 //
...61 returnnull;62 }6364 /**65 *
this class is called by startupAcceptor() method it's a thread accepting66 *
incoming connections from client67 *68 *
@author ChenHui69 *70 */71 privateclassAcceptor implementsRunnable
{72 @Override73 publicvoidrun()
{74 assert(acceptorRef.get()
== this);7576 intnHandles
= 0;7778 lock.release();7980 while(selectable)
{81 try{82 intselected
= select();8384 //
nHandles+=registerHandles();8586 if(nHandles
== 0)
{87 acceptorRef.set(null);88 //
...89 }90 } catch(Exception
e) {9192 }93 }94 }95 }96}001packageorg.apache.mina.rewrite.transport.socket.nio;002003importjava.net.InetSocketAddress;004importjava.net.ServerSocket;005importjava.net.SocketAddress;006importjava.nio.channels.SelectionKey;007importjava.nio.channels.Selector;008importjava.nio.channels.ServerSocketChannel;009importjava.util.concurrent.Executor;010011importorg.apache.mina.core.rewrite.polling.AbstractPollingIoAcceptor;012importorg.apache.mina.rewrite.transport.socket.SocketAcceptor;013014publicfinalclassNioSocketAcceptor extendsAbstractPollingIoAcceptor015 implementsSocketAcceptor
{016017 privatevolatileSelector
selector;018019 protectedNioSocketAcceptor(Object
param, Executor executor) {020 super(param,
executor);021 //
TODO Auto-generated constructor stub022 }023024 @Override025 publicintgetManagedSessionCount()
{026 //
TODO Auto-generated method stub027 return0;028 }029030 /**031 *
这个方法继承自AbstractIoAcceptor032 *033 *
The type NioSocketAcceptor must implement the inherited abstract method034 *
SocketAcceptor.getLocalAddress() to override035 *
AbstractIoAcceptor.getLocalAddress()036 */037 @Override038 publicInetSocketAddress
getLocalAddress() {039 //
TODO Auto-generated method stub040 returnnull;041 }042043 @Override044 publicvoidsetDefaultLocalAddress(InetSocketAddress
localAddress) {045 //
TODO Auto-generated method stub046047 }048049 @Override050 publicbooleanisReuseAddress()
{051 //
TODO Auto-generated method stub052 returnfalse;053 }054055 @Override056 protectedvoidinit() throwsException
{057 selector
= Selector.open();058 }059060 @Override061 protectedvoiddestory() throwsException
{062 if(selector
!= null)
{063 selector.close();064 }065 }066067 @Override068 protectedintselect() throwsException
{069 returnselector.select();070 }071072 @Override073 protectedvoiddispose0() throwsException
{074 //
TODO Auto-generated method stub075076 }077078 protectedServerSocketChannel
open(SocketAddress localAddress)079 throwsException
{080 ServerSocketChannel
channel =ServerSocketChannel.open();081 082 booleansuccess=false;083 084 try{085 channel.configureBlocking(false);086 087 ServerSocket
socket=channel.socket();088 089 socket.setReuseAddress(isReuseAddress());090 091 socket.bind(localAddress);092 093 channel.register(selector,
SelectionKey.OP_ACCEPT);094 095 success=true;096 }finally{097 if(!success){098 //close(channel);099 }100 }101 returnchannel;102 }103104 @Override105 publicbooleanisActive()
{106 //
TODO Auto-generated method stub107 returnfalse;108 }109110}