原文:http://www-128.ibm.com/developerworks/cn/java/l-niosvr/
代码分为框架工具,和框架外代码两个部分.
框架实现了短连接的实现方式,即服务端处理请求,返回信息给客户后就关闭连接,用户也关闭连接,这次访问结束.客户应用程序也结束.而服务端程序没有结束,不断地监听是否有新的连接到了,有就处理.处理完再关闭此新的连接.如此循环.
包括
Runnable:Server.这是框架的主线程.构造方法传入一个port,生成服务端Socket.并启动N个Reader
N个Writer. run()开始监听socket的各种事件.
Runnable:Reader 读线程池,负责维护所有读线程,run()负责封装Request数据.之后触发onRead时间,
注册了该事件的处理器就可以通过Request得到数据,并执行相应的处理.设计的想法是不在此处返回
数据给客户端.仅仅在这执行一些别的操作.例如读写数据库之类的.
之后返回主线程.
Runnable: Writer 写线程池,接收主线程传来得key,并封装Response对象.之后触发onWriter事件,这样所有
注册了该事件的处理器就可以通过Request得到数据,并通过Response返回给客户端.
设计的思路是:把主要的处理分离出来,放到了事件处理器中.而不是在Writer线程池代码中
去写.
接口:ServerListener.定义了所有事件方法.
抽象类: EventAdapter,实现了ServerListener的所有方法,不过是空的实现.
单例类: Notifer 触发器.维护了所有监听者的List.并有出发ServerListener所有事件的触发方法.
框架外代码包括:
EventAdapter的子类.具体实现ServerListener中的某个接口.
服务类:
使用框架类: 1,得到单例的Notifer.
2,构造所有EventAdapter的子类.并注册到Notifer.
3,传给Server一个端口,并构造Server线程.并启动.
框架是一个短连接,所谓短连接就是每个客户请求,服务端处理之后就马上关闭.
可以修改成长连接,服务端不关闭客户的连接,除非自己出现了异常,才关闭连接.或者客户端已经关闭连接了,
服务端才关闭连接.否则一直连着.通讯也都使用同一个连接.
需要修改的地方:1,主线程处理读后注释掉这句话: key.cancel()
2,Writer封装完Response,fireOnWriter(Request,Response)之后,不要关闭socketCannel.