每日一学之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 条评论
登录 后参与评论

相关文章

来自专栏Spark学习技巧

Kafka源码系列之通过源码分析Producer性能瓶颈

Kafka源码系列之通过源码分析Producer性能瓶颈 本文,kafka源码是以0.8.2.2,原因是浪尖一直没对kafka系统进行升级。主要是java的ka...

2626
来自专栏小白鼠

ZookeeperZNode基本命令四字命令SessionWatcherACLZookeeper集群Paxos算法ZAB协议Curator分布式锁

在Zookeeper中,ZNode可以分为持久节点和临时节点两类。所谓持久节点是指一旦这个ZNode被创建了,除非主动进行ZNode的移除操作,否则这个ZNod...

683
来自专栏java学习

数据库连接池C3P0,DBCP教程详解示例

连接池 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。...

5696
来自专栏Golang语言社区

在Go程序中实现服务器重启的方法

Go被设计为一种后台语言,它通常也被用于后端程序中。服务端程序是GO语言最常见的软件产品。在这我要解决的问题是:如何干净利落地升级正在运行的服务端程序。 目标:...

3257
来自专栏技术碎碎念

Java NIO

了解java的NIO,需要先了解同步异步以及阻塞非阻塞的概念,同步/异步,阻塞/非阻塞 NIO就是采用的同步非阻塞这种组合方式。或简单一点,采用的是IO复用的策...

3814
来自专栏前端小栈

mongoDB 基础教程笔记

从mongoDB官网 下载 MongoDB 的最新版本,直接一路next,如果想自定义安装Choose Setup Type处选择Custon

804
来自专栏Android开发指南

eclipse遇到的问题

35110
来自专栏aoho求索

基于可靠消息方案的分布式事务(四):接入Lottor服务

在上一篇文章中,通过Lottor Sample介绍了快速体验分布式事务Lottor。本文将会介绍如何将微服务中的生产方和消费方服务接入Lottor。

1911
来自专栏IT可乐

JS 中 cookie 的使用

1、cookie 是什么?   ①、cookie 是存储于访问者计算机中的变量。每当一台计算机通过浏览器来访问某个页面时,那么就可以通过 JavaScript ...

1897
来自专栏difcareer的技术笔记

ELF中可以被修改又不影响执行的区域

看雪上这篇文章讲述了两种对so进行加固的方法:1. 分离section,对整个section进行加密。2.在.text section直接寻找目标函数并进行加密...

894

扫码关注云+社区