关于xsocket可见于 我的另外一篇文章http://www.blogjava.net/freeman1984/archive/2011/04/25/302706.html,或者查看官网http://xsocket.org/
当然阅读xsocket需要一些线程,nio,niosocket,和java.util.concurrent(锁,线程池等)包的一些知识。要不读起来很费劲,建议先去了解下这些知识。可以在我的文章分类concurrent里面有一些,其他去网上找找。
本文只读了一个主要的流程,对于一些其他的代码例如:ssl相关,读数据相关没有涉及,看有时间能补上。
首先xsocket的几个关键的类
Server: 服务器端初始化线程池创建IoAcceptor
IoAcceptor:采用while循环接收客户端连接,并创建IoSocketDispatcher和IoChainableHandler
IoSocketDispatcher:负责注册SelectionKey以及事件的分发,并交给IoChainableHandler处理,通过一个while循环来处理注册的SelectionKey事件。
IHandler:事件处理,数据的读写等等。
INonBlockingConnection客户端接口。
(1)首先看下Server创建:
构造方法
protectedServer(InetSocketAddress address, Mapoptions, IHandler handler, SSLContext sslContext,
booleansslOn,intbacklog,intminPoolsize,intmaxPoolsize,inttaskqueueSize)
这个方法主要是初始化线程池,构件acceptor
defaultWorkerPool=newWorkerPool(minPoolsize, maxPoolsize, taskqueueSize);
workerpool=defaultWorkerPool;
if(sslContext!=null)
{//是否使用ssl
acceptor=ConnectionUtils.getIoProvider().createAcceptor(newLifeCycleHandler(), address, backlog, options, sslContext, sslOn);
}else
{
acceptor=ConnectionUtils.getIoProvider().createAcceptor(newLifeCycleHandler(), address, backlog, options);
}
其中线程池:使用jdk1.5以后的ThreadPoolExecutor,线程池最小默认2,最大100,QUEUE的大小默认也是100
线程池最小:MIN_SIZE_WORKER_POOL = Integer.parseInt(System.getProperty("org.xsocket.connection.server.workerpoolMinSize", "2"));
SIZE_WORKER_POOL = Integer.parseInt(System.getProperty("org.xsocket.connection.server.workerpoolSize", "100"));
TASK_QUEUE_SIZE = Integer.parseInt(System.getProperty("org.xsocket.connection.server.taskqueuesize", Integer.toString(SIZE_WORKER_POOL)));
(2)构件acceptor细节,最后server启动的时候会启动acceptor监听客户端
publicIoAcceptor(IIoAcceptorCallback callback, InetSocketAddress address,intbacklog, SSLContext sslContext,booleansslOn,booleanisReuseAddress)throwsIOException
{
.
serverChannel=ServerSocketChannel.open();
serverChannel.configureBlocking(true);
serverChannel.socket().setSoTimeout(0);//accept method never times out
serverChannel.socket().setReuseAddress(isReuseAddress);