(基础篇 走进javaNIO)第二章-NIO入门

在本章巾,我们会分别对 JDK 的BIO ,NIO 和JDK 1.7 最新提供的 NI02.0的使用进行详细说明 ,通过流程图和代 码讲解,让大 家体会到随着 Ja va 1/0 类库的 不断发展和改进,基于 Java 的网络编程会变得越来越简单 ,随着异步 I/0 功 能的增强,基于Java NIO 开发 的网络服务器甚至不逊色于采用 C++开发的网络程序 。

本章主要 内容包括 :

1.传统的 同步阻塞式 1/0 编程

2.基于 NIO 的非阻塞编程

3.基于 NI02 .0 的异步非阻塞 ( AJO )编程

4.为什么要使用 NIO  编程

5.为什 么选择N etty



2.1    传统的 BIO 编程

网络编程 的基本模型是 Client/Server 模型 ,也就是两个进程 之 间进行相互通信 ,其 中 服务端提供位 置信息 ( 绑定的 IP  地址和监听端口 ) ,客户端通过连接操作 向服务端监听的址发起连接请求 ,通过三次握手建立连接 ,如果连 接建立成功,双方就可以通过 网络套接字 ( Socket ) 进行通信 。

在基于传统同步阻塞模型开发中 ,

Server Socket 负责绑定 IP 地址 ,启动监昕端 口:

Socket 负责发起连接操作 。连接 成功之后 ,双方通过输入 和输 出流进行同步阻塞式通信 。

下雨,我们就 以经典的时间服务器 ( TimeServer ) 为例 ,通过代码 分析来回顾和 熟悉 下 BIO  编程 。

2.1 .1           BIO 通信模型图

首先 ,我 们通过图 2- 1 所示 的通信模型图 来熟悉BIO 的服务端通信模型 :采用 BIO 通信模型的服务端 ,通 常 由一个独立 的 Acceptor 线程负责监听客户端的连 接 ,它接 收到客 户端连接请求之后为每个客户端创建 一个新 的线程进行处理 ,处理完成之后 ,通过 输 出流返 回应答给客户端 ,线程销毁 。这就是 典型的一请求 一应答通信模型

该模型最大的问题就是缺乏弹性伸缩 能力 ,当客户 端并发访问量增加后 ,服 务端的线 程个 数和客户端并发访 问数量. 1 : 1 的正 比关系 ,由于线程 是 Java 虚拟机非常宝贵的系统 资源 ,当线程数膨胀之后 ,系统的 性 能将急剧 下降,随着并发访问量 的继续增大 ,系统会 发生线程堆溢出、创建新线程 失败等问题 ,并最 终导致进程岩机或者僵死,不能对外提 供服 务 。

下面的两个小节 ,我们会 分别对服务端和客户端进行源码分析,寻找同 步阻塞I/0的弊端 。

2. 1.2     同步阻塞式 1/0 创建 的 Timeserver 源码分析

代码 清单 2-1同步 阻塞 I/0 的 TimeServer

( 备注 :以 下代 码行号 均 对应 源 代码 中实 际行号 。)

时间: 2024-10-06 13:36:37

(基础篇 走进javaNIO)第二章-NIO入门的相关文章

ESP8266开发之旅 基础篇① 走进ESP8266的世界

本博客由 单片机菜鸟 个人撰写,仅仅做个人技术交流分享,不做任何商业用途,不经允许,切勿转载.如有不对之处,请留言,本人及时更改. 一.基础篇 ESP8266开发之旅 基础篇① 走进ESP8266的世界 ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境 ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明 ESP8266开发之旅 基础篇④ ESP8266与EEPROM ESP8266开发之旅 基础篇⑤ ESP8266 SPI通信和I2C通信

第二章Python入门

第二章 Python入门 2.1.简介 Python是著名的"龟叔"(Guido van Rossum)在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言 Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码.为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容, 2.1.1.Python适合开发哪些类型的应用呢? 云计算 机器学习 科学运算 自动化运维 自动化测试 爬虫 数据分析 GUI图形化 Web开发等 2.1.2.P

第二章 算法入门 合并排序

在第二章中难的算法不多,接下来我会把稍微复杂一点的算法整理一下 #include <iostream> using namespace std; void mergeSort(int *A,int left,int mid,int right) { int *L=new int[mid-left+1]; int *R=new int[right-mid+1]; int i,j; for(i=0;i<mid-left+1;i++) { L[i]=A[left+i]; } for (j=0;

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

一.插入排序:INSERTION-SORT 1.适用范围: which is an efficient algorithm for sorting a small number of elements. 对于少量元素的排序,插入排序是一种高效的算法. 2.原理: Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards

java基础篇---新I/O技术(NIO)

在JDK1.4以前,I/O输入输出处理,我们把它称为旧I/O处理,在JDK1.4开始,java提供了一系列改进的输入/输出新特性,这些功能被称为新I/O(NEW I/O),新添了许多用于处理输入/输出的类,这些类都被放在java.nio包及子包下,并且对原java.io包中的很多类以NIO为基础进行了改写,新添了满足新I/O的功能. Java NIO和IO的主要区别 IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 面向缓冲(Buffer) 在整个Java的心I/O中,所以操作都

《Python数据科学手册》第二章 Numpy入门2.1—2.3

 2.1 理解Python中的数据类型 Python的用户被其易用性所吸引,其中一个易用之处就在于动态输入,即在Python中,类型是动态推断的.这意味着可以将任何类型的数据指定给任何变量.但是这种类型灵活性也指出了一个事实: Python 变量不仅是它们的值,还包括了关于值的类型的一些额外信息 . C语言整型本质上是对应某个内存位置的标签,里面存储的字节会编码成整型.而Python的整型其实是一个指针,只向包含这个Python对象所有信息的某个内存位置,其中包括可以转换成整型的字节.Pytho

第二章 Python入门

第一章计算机基础的部分,以后整理完后更新. 2.1 环境安装 学习python需要的环境(mac/windows): 解释器:py2\py3 开发工具:pycharm 2.2 编码 2.2.1 编码基础 常见编码: ascii (英语) unicode (内存中使用的编码,可以支持世界上任何语言符号.又称:万国码.由联合国组织定义) cse2 (以前常用的编码形式) cse4 (常用的编码形式) gbk (中文编码的一种,现在广泛被使用) gb2312 (中文编码的一种,比较旧的编码) utf

【Java 基础篇】【第二课】基本数组类型

就像第一章所说一样,这次学习为了快,因此说明性的文字就不想写太多了,直接帖代码吧,代码当中尽量加一些注释: 1 package a.b; 2 3 public class test 4 { 5 6 static void BasicVariables() 7 { 8 //一.变量的类型的学习 9 System.out.println("一.变量的类型的学习 "); 10 11 // byte 表数范围:-128~127, 存储大小占1byte 12 byte a; 13 a = 12;

机试指南第二章-经典入门-Hash的应用自解

Hash的应用: Hash即散列,不像数据结构与算法中讲的各种Hash方法和冲突处理等过多的阐述,以下主要介绍Hash在机试试题解答中的作用. 例2.5 统计同成绩学生人数 Hash解法AC代码:(一般想到的也是这种解法) #include<cstring> #include<iostream> using namespace std; int grade[105]; int main() { int n, m, index; memset(grade, 0, sizeof(gra