每日一学之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中的图片和动画部分。敬请期待!

本文来自企鹅号 - 人人会编程媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT开发技术与工作效率

jvm配置简洁说明

-Xms启动内存 -Xmx最大内存 -Xmn年轻内存 -Xss线程堆栈 -XX:NewRatio=年轻/年老 -XX:SurvivorRatio=Ed...

721
来自专栏JMCui

Netty 系列二(传输).

    上一篇文章我们提到 Netty 的核心组件是 Channel、回调、Future、ChannelHandler、EventLoop,这篇文章主要是对 C...

1032
来自专栏个人分享

Netty服务端与客户端(源码一)

  (4)创建Selector,将之前创建的ServerSocketChannel注册到Selector上,监听SelectionKeyACCEPT。

802
来自专栏函数式编程语言及工具

Akka-Cluster(0)- 分布式应用开发的一些想法

  当我初接触akka-cluster的时候,我有一个梦想,希望能充分利用actor自由分布、独立运行的特性实现某种分布式程序。这种程序的计算任务可以进行人为的...

923
来自专栏你不就像风一样

Netty入门(一)之webSocket聊天室

1263
来自专栏木木玲

Netty in action ——— 事件循环 和 线程模式

1693
来自专栏pangguoming

Java NIO框架Netty教程(一) – Hello Netty

先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那可以先简单的搜索了解一下。我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序。具体...

1714
来自专栏QQ会员技术团队的专栏

HTTP/2 探索第一篇:概念

现在网络优化的瓶颈是什么?你可能会说,带宽。也许在2014年前,决定性能的关键是带宽,但是在今天以及以后,瓶颈都不会是带宽,而是延迟。

2.3K1
来自专栏分布式系统进阶

Kafka是如何处理客户端发送的数据的?

// respond immediately if // 1) fetch request does not w...

811
来自专栏BaronTalk

写给 Android 应用工程师的 Binder 原理剖析

这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔。生怕自己理解上还有偏差,对大家造成误解,贻笑大方。又怕自己理解不够透彻,无法用清晰直白的文字...

51110

扫码关注云+社区