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

相关文章

来自专栏JAVA技术站

Sharding-Jdbc分库分表的导读

Sharding-JDBC是一个开源的分布式数据库中间件,它无需额外部署和依赖,完全兼容JDBC和各种ORM框架。Sharding-JDBC作为面向开发的微服...

1274
来自专栏项勇

笔记16 | 解析和练习AsyncTask

1476
来自专栏余林丰

初识数据库连接池开源框架Druid

Druid是阿里巴巴的一个数据库连接池开源框架,准确来说它不仅仅包括数据库连接池这么简单,它还提供强大的监控和扩展功能。本文仅仅是在不采用Spring框架对Dr...

2179
来自专栏kl的专栏

spring boot集成WebSocket实时输出日志到web页面

前言碎语 今天来做个有趣的东西,就是实时将系统日志输出的前端web页面,因为是实时输出,所有第一时间就想到了使用webSocket,而且在spring boot...

4428
来自专栏Jaycekon

Spring-Blog:个人博客(一)-Mybatis 读写分离

概述: 2018,在平(tou)静(lan)了一段时间后,开始找点事情来做。这一次准备开发一个个人博客,在开发过程之中完善一下自己的技术。本系列博客只会提出一...

3139
来自专栏Java编程技术

高性能网络通信框架Netty-Java NIO基础

本节我们使用JDK中原生 NIO API来创建一个简单的TCP客户端与服务器交互的网络程序。

832
来自专栏大大的微笑

返回执行结果的任务队列:ExecutorCompletionService

有时候我们需要展示一些内容,如果等所有内容都加载完毕再展示这样反而会降低用户体验; 因为如果消耗时间长那么用户需要瞪着空白的页面,反而会失去兴趣; 所以我们...

2069
来自专栏pangguoming

spring boot 发送邮件

简单几步,实现在spring boot中发送邮件: 1、引入依赖: <dependency>   <groupId>org.springframework....

3648
来自专栏JAVA高级架构开发

一个分布式java爬虫框架JLiteSpider

A lite distributed Java spider framework. 这是一个轻量级的分布式java爬虫框架

880
来自专栏Jaycekon

Java消息队列-Spring整合ActiveMq

1、概述 ----   首先和大家一起回顾一下Java 消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了: 消息服务:一个中间件,用于...

3835

扫码关注云+社区