我把这个Java Socket网络通信框架取名为『susu』并上传到Google code ,svn下载地址为:http://susu.googlecode.com/svn/trunk/ ,关于框架的设计思想在前面一篇已经做了描述,在这里着重介绍一下关键类的实现。
NioSocketAcceptor、NioSocketConnector两个类的功能比较简单,看一眼就知道是什么意思,Filter定义了过滤器基础方法,主要包括以下的方法:init、destroy和getOrder三个方法。
后面 继承了两个接口InputFilter和OutputFilter两个接口的定义如下:
IoHandler 读取数据和发送数据的接口,定义如下:
同时实现的一个通用的Socket读写类AbstractIoHandler,这个是一个抽象类,根据项目的需求继承这个类,然后实现三个个方法
注:一般报文的定义都是报文的头几个字节用来描述整个报文长度, AbstractIoHandler根据这个报文长度来接收一个完整的报文,int getLenthOfLenth 获得使用几个直接来表示一个报文的长度,比如8,那么就是表示报文前8位是用来表示报文长度的。int getLenth(byte[] lenth);表示通过一个 byte[] lenth数组获得一个报文的int长度,因为报文长度可能会用不同的形式表示,比如用8位的一个字符串表示00000435表示报文长度是 435个字节,也有可能用4位的16进制表示,例如00F0 表示报文有15个字节。 boolean hasContainHead()报文头的本身长度是否包涵在报文头里面,举例说明一下, 00000435表示收到的报文头,总共8位,如果报文头本身的长度包含的报文里面,那说明下面还有 435 - 8 =427个字节需要接收,反之 如果报文头本身的长度不包含的报文里面, 那说明下面还有 435个字节要接收。
如果有特殊的需求,只要重新写一个类实现 IoHandler接口就可以了。
Session 用于过滤器之间传递数据和用户信息,定义的接口如下
下面介绍一下这个框架的核心部分,AbstractProcessor由N+1个线程组成,一个线程负责从socket读取数据,然后把数据放入队列等待处理,N(CPU的个数或者核数)个处理线程,负责从队列中读取Event 进行处理。具体实现请参考代码。