天天看点

网络NIO编程简介

      文件IO用到的FileChannel并不支持非阻塞操作,NIO用得更多的是在网络IO中,NIO中的网络通道是非阻塞IO的实现,基于事件驱动,非常适用于服务器需要位置大量连接,但是数据交换量不大的情况。

在Java中编写Socket服务器,通常有以下几种模式:

一个客户端连接用一个线程,优点:程序编写简单;缺点:如果连接非常多,分配的线程也会非常多,服务器可能会因为资源耗尽而崩溃。

把每一个客户端连接交个一个拥有固定数量线程的连接池,优点:程序编写相对简单,可以处理大量的连接。缺点:线程的开销非常大,连接如果非常多,排队现象比较严重。

使用NIO,用费阻塞的IO方式处理。这种模式可以用一个线程,处理大量的客户端连接。

1、Selector(选择器),能够检测多个注册的通道上是否有时间发生,如果有事件发生,便获取事件然后针对每个事件进行相应的处理。这样就可以只用一个单线程去管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用维护多个线程,并且避免了多线程之间的上下文切换导致的开销。

网络NIO编程简介

该类的常用的方法如下所示

public static Selector open() 得到一个选择器对象

public int select(long timeout) 健康所有注册的通道,当其中有IO操作可以进行时,对应的SelectionKey加入到内部稽核中并返回,参数用来设置超时时间

public Set<SelectionKey> selectedKeys() 从内部稽核中得到所有的SelectionKey

2、SelectionKey,代表了Selector和网络通道的注册关系,一共四种:

  • int OP_ACCEPT 有新的网络连接可以accept,值为16
  • int OP_CONNECT 代表连接已经建立,值为8
  • int OP_READ和OP_WRITE 代表了读、写操作,值为1和4

该类常用方法如下:

  • public abstract Selector selector(),得到与之关联的Selector 对象
  • public abstract SelectableChannel channel(),得到与之关联的通道
  • public final Object attachment(),得到与之关联的共享数据
  • public abstract SelectionKey interestOps(int ops),设置或改变监听事件
  • public final boolean isAcceptable(),是否可以accept
  • public final boolean isReadable(),是否可以读
  • public final boolean isWritable(),是否可以写

3、ServerSocketChannel,用来在服务器端监听新的客户端Socket 连接

常用方法如下所示:

  • public static ServerSocketChannel open(),得到一个ServerSocketChannel 通道
  • public final ServerSocketChannel bind(SocketAddress local),设置服务器端端口号
  • public final SelectableChannel configureBlocking(boolean block),设置阻塞或非阻塞模式,取值false 表示采用非阻塞模式
  • public SocketChannel accept(),接受一个连接,返回代表这个连接的通道对象
  • public final SelectionKey register(Selector sel, int ops),注册一个选择器并设置监听事件

4、SocketChannel,网络IO 通道,具体负责进行读写操作

常用方法如下所示:

  • public static SocketChannel open(),得到一个SocketChannel 通道
  • public final SelectableChannel configureBlocking(boolean block),设置阻塞或非阻塞模式,取值false 表示采用非阻塞模式
  • public boolean connect(SocketAddress remote),连接服务器
  • public boolean finishConnect(),如果上面的方法连接失败,接下来就要通过该方法完成连接操作
  • public int write(ByteBuffer src),往通道里写数据
  • public int read(ByteBuffer dst),从通道里读数据
  • public final SelectionKey register(Selector sel, int ops, Object att),注册一个选择器并设置监听事件,最后一个参数可以设置共享数据
  • public final void close(),关闭通道
网络NIO编程简介

继续阅读