每日一学之socket编程(四)

图片来自于百度图片

NIO

专门为服务器而设计的API。能极大的提高IO的性能,避免使用大量线程。虽然是为了服务器而设计,但是依然可以被使用在客户端。

Channel(通道)

在标准IO中,直接操作的是stream(流);在NIO中使用的是Channel,Channel其实就是模拟了流的概念,只是比流的功能更加强大,性能更强。

通道必须和Buffer一起使用。

Channel相比Stream的主要优势体现在:

1、支持双向操作

2、异步操作

3、读写性能更高

Selector(选择器)

SelectableChannel对象的多路复用器,一个Selector可以监控多个通道,是NIO的核心。在此之前有必要给大家理一下几个主要使用的channel的主要关系。

主要继承关系

创建NIO的服务端

在标准IO中,我们的第一步是获取Socket,但是在NIO中,我们要创建相应的Channel:

在标准IO中,创建ServerSocket之后,就将此ServerSocket绑定到某端口,同理:

在标准IO中,到这里就开始使用accept的模式等到连接了,在NIO中,一样要设置以阻塞还是非阻塞模式:

还记得我们上面说过的seletor吗?它是SelectableChannel 对象的多路复用器,我们的ServerSocket不就是继承自SelectableChannel吗,所以这一步为注册ServerSocket:

在selector中注册的标记,主要有四种状态:

SelectionKey.OP_ACCEPT:可接收连接

SelectionKey.OP_CONNECT:可连接

SelectionKey.OP_READ:可读

SelectionKey.OP_WRITE:可写

我们需要另外开启一个线程来循环的发现Selector中是否有就绪的通道:

假定发现了一个就绪的通道,调用器selectedKeys方法会返回一个set集合,它包含了一个对应于就绪通道的SelectionKey对象:

如果就绪的通道是服务器通道,程序就会接受新的socket通道,并将通道注册进selector:

继续处理注册进来的新的通道:

一个服务端的程序终于写完了。由于受到篇幅的限制,完整的客户端和服务端的程序大家可以到此下载:https://pan.baidu.com/s/1kViUc9h

下期提要

下期开始,我们继续回归Android,将开始重点讲述Android中的图片和动画部分。敬请期待!

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171211G03S4B00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区