演示SelectableChannel的阻塞服务器
(1)使用ServerStockChannel.open()方法创建ServerStockChnnel对象
(2)可以使用ServerStockChannel对象的stocket()方法获得关联的ServerStock方法设置选项.
配置等.(例如set***,并且绑定端口bind)
(3)使用accept获取客户请求,此时是阻塞的.就是当没有请求是此方法会将这个现场挂起.
(4)使用获取的StocketChannel.socket方法获取与之关联的Stocket.然后像普通的Stocket得到输入输出流,得到数据.
(5)第四步可以使用StocketChannel的read方法获取数据,但是比较麻烦,需要用到nio的知识.
演示SelectableChannel的非阻塞服务器
(1)使用ServerSocketChannel.open()创建一个ServerSocketChannel.
(2)使用ServerSocketChannel对象的socket()方法获得ServerSocket.设置服务器的配置等.
(3)SocketChannel.configureBlocking(false) 设置为非阻塞模式.
(4)使用Selector.open()创建Selector对象.然后然后使用ServerSocketChannel的register方法注册一个监听器.
(5)使用Selector.selectedKeys()返回已经捕获的事件.集合为Set集合遍历集合中的SelectionKey对象.用取出对象的is**方法判断其是哪个时间.然后执行处罚.
总结:使用ServerSocketChannel和SocketChannel时可以使用socket方法获得底层的stock对象,然后配置服务器和客户端.在使用register注册事件监听器时,需要Selector此对象包含注册过的事件类型,然后返回SelectionKey对象,此对象也可以从Selector的集合中取出,然后用这个对象判断是否发生所代表的事件.
阻塞模式和非阻塞模式都可以同时处理多个客户程序,但阻塞模式需要的线程多,这大大的增加了系统的开销,而非阻塞模式需要的线程少,阻塞模式编程简单,非阻塞编程模式难.