美文网首页
java NIO 网络

java NIO 网络

作者: 云师兄 | 来源:发表于2018-10-24 14:04 被阅读9次

    ServerSocketChannel

    • open方法:抽象类,不能直接new实例化,可使用open方法创建实例,即打开服务器端套接字通道。
    • bind方法:新通道尚未绑定,可使用bind方法绑定具体的地址,bind方法可使用参数backlog来限制客户端连接的数量。
    • accept方法:接受此通道套接字的连接,如果通道为非阻塞模式则此方法直接返回null,如果为阻塞模式,则在此阻塞。可调用configureBlocking方法进行阻塞模式之间的切换。
    • socket方法:返回ServerSocket类对象,也可以借此使用ServerSocket对象进行accept操作。
    • close方法:关闭通道
      从上述几点可以看出ServerSocketChannel类是ServerSocket类的封装,而前者相比于后者的优点就在于IO多路复用。

    使用Selector对象实现IO多路复用

    ServerSocketChannel的accept方法返回SocketChannel通道实例可以被注册到Selector选择器中实现IO多路复用,下面就具体来讲下Selector类(实际上下面几点不全是Selector的方法,很多都是通道类的方法,请注意)。

    • Selector类的open方法: 抽象类,使用open方法获取对象,即打开一个选择器,使SelectableChannel能将自身注册到这个选择器上。
    • SelectableChannel类的register(Selector sel,int ops)方法传入选择器sel,实现向选择器注册通道,返回SelectionKey,意味着已经注册;传入ops操作集合,表示通道感兴趣的事件,即通道能执行操作的集合。
    • SelectableChannel类的isRegistered方法判断当前通道是否向任何选择器注册。
    • 如果想把通道注册到选择器中,就必须将通道设置为非阻塞模式,即通道执行configureBlocking方法传入false。
    • 通道类的isBlocking方法判断此通道上的IO操作是否阻塞,新创建通道默认阻塞。
    • 通道类的findKey(Selector sel)方法:由于一个通道类可以注册到不同选择器中,所以此方法通过选择器来获取注册后返回的SelectionKey。
    • provider方法:返回创建此通道的SelectorProvider。当调用Selector.open()时,选择器通过专门的工厂SelectorProvider来创建Selector的实现。
    • 相同的通道可以注册到不同的选择器,返回的SelectionKey对象不是同一个对象;不同的通道可以注册到相同的选择器,返回的SelectionKey对象也不是同一个对象。
    • 通道类的validOps方法返回一个结果集,标示此通道所支持的操作。比如服务器端套接字只支持新的连接,所以返回SelectionKey.OP_ACCEPT。

    SocketChannel

    • connect方法:作用是连接到远程通道的socket。如果是非阻塞模式,则不是立即发起连接,而是在随后某个时间内才发起连接;如果是阻塞模式则是立即进行连接。阻塞模式和非阻塞模式相比在连接失败的时候,阻塞模式耗时比非阻塞模式耗时更多,连接成功返回true,连接失败返回false。

    SelectionKey

    选择器维护了三种SelectionKey-Set:

    • 键集:通道向选择器注册后,键集中添加一个键。可以使用Selector的keys方法获取这个集合。
    • 已选择集合:选择器调用select方法选择时,会调用selectedKeys方法返回已就绪的集合。
    • 已取消键集:表示已被取消但通道尚未注销的键的集合。关闭某个键的通道或者调用该键的cancel方法来取消,都会将键放到已取消键集中。

    参考文章

    相关文章

      网友评论

          本文标题:java NIO 网络

          本文链接:https://www.haomeiwen.com/subject/osgttqtx.html