创建非阻塞的Socket服务器<三>

上两篇文章我简单总结了NIO包中的class也提到了Buffer和Charset 说了他们的用途,
这次我们再来看看NIO中最重要的一个类Channel,之所以说它重要,并不是他自身的用途有多大
而是他的子类!很强大,SelectableChannel ReadableByteChannel WritableByteChannel 都是他的子类,就是因为这些类他很重要!我们来具体来看看(在Channel下不仅仅这几个类)

ReadableByteChannel  WritableByteChannel  可以看出了他们是相对的我这里就解释一个类那么另一个类我们就知道是做什么的了!

ReadableByteChannel 中有一个read 方法

read(ByteBuffer bb)

这个方法就是把数据读入到指定的bb 这个缓冲区中。他还有很多子类但是这里我们不详细讲解了

下面来看看SelectablChannel 他是一种支持阻塞和非阻塞模式的通道。那么我们怎么来设置通道是不是阻塞呢?这个方法就是
configureBlcoking(boolean b)

他另外的重要的方法 就是
register(Selector sel,int options)

那么这个方法的作用是什么呢?怎么解释呢?我是这样理解的不知道理解对不对?

register这个方法就是把通道注册到相对应的Selector对象中并为这个通道添加一个标示以表示能在下次接收到相应的Selector 的时候 能根据我添加的这个 标示 知道要发生什么事情!

看到这里你可能会疑惑到底 通道是怎么处理数据的呢?
是的,任何处理数据的方式都离不开 读和写操作。。但是在SelectableChannel 并没有这两个方法,而在他的子类中(SocketChannel),你可能注意到了 ServerSocketChannel也是他的子类,但是他没有,同样是子类为何一个定义了。。一个没有定义这个read 和write 方法呢?

这是当然的。。。一个父亲有多个儿子,他们的学历不同能力的东西也不同,因为 ServerSocketChannel 里面能够产生SocketChannel 。。所以 他就可以产生这个对象,以至于他也用于了 read 和write 方法。。。
说到这里 你是不是明白些了!

那么我们接下来看看Selector 。。。刚才已经提到了。他给我感觉就是一个监视器,同时关注 ServerSocketChannel 和SocketChannel,因此下一个对象(SelectKey)就产生了,他就是专门表示标示的那个类,这样 我们就能在处理数据的时候根据标示的不同而做出不同的业务逻辑处理了。。


看一下 我自己理解NIO处理的整个过程
创建非阻塞的Socket服务器<三>_第1张图片

[/img]

你可能感兴趣的:(socket,ITeye)