网络编程之NIO
传统的BIO(Blocking IO)的缺点:
1、基于阻塞式IO建立起来的,导致服务端一直阻塞等待着客户端发起请求,如果客户端不发起,服务端的的业务线程会一直存。
2、弹性伸缩能力差,线程数和客户端数是1:1的关系,服务器压力大。
3、多线程非常耗资源。
NIO(Non-blocking IO)优点:
1、基于非阻塞IO构建的,服务端建立一个单线程的Selector来管理与所有客户端接入的Socket连接,并负责监听每个连接所关心的事件。
2、弹性伸缩能力加强了,服务端和客户端比例是1:M的关系。
3、单线程节省资源,节省了之前的BIO的多线程的花费的资源。
NOI核心:
1、channel 双向性;2、非阻塞性;3、操作唯一性(给予数据块的操作只能使用buffer);
2、Buffer的四核属性,capacity 容量,Position 位置,Limit上限,Mark 标记
3、Selector 选择器(多路复用器)
NIO编程实现步骤:
1、创建Selector
2、创建ServerSocketChannel,并绑定监听端口
3、将channel设置为非阻塞模式
4、将channel注册到selector上,监听连接事件
5、循环调用selector的select方法,检测就绪情况
6、调用的selectedKeys方法获取就绪channel集合
7、判断事件就绪种类,调用相应的业务处理方法
8、根据业务需要决定是否有需要再次注册监听事件,重复执行第三步操作
缺陷分析:
客户端的断连重连,网络闪断,段包读写,失败缓存,网络阻塞,异常码流,在可靠能力补全方面投入的时间和成本将是非常巨大的,原生NIO雨哦一个bug一直能没有改好,主要出现在类Linux操作系统上,根据API规定,调用selector的select方法时如果没有准备就绪的channel他应该阻塞在select的调用上,但linux下的selector使用的是depool IO事件通知工具,操作系统使用这一高性能的技术与网络协议栈异步工作,导致就算没有就绪的channel也不会阻塞,该问题发生概率较低。
网络编程之NIO的更多相关文章
- 【Java】网络编程之NIO
简单记录 慕课网-解锁网络编程之NIO的前世今生 & 一站式学习Java网络编程 全面理解BIO/NIO/AIO 内容概览 文章目录 1.[了解] NIO网络编程模型 1.1.NIO简介 1. ...
- 解锁网络编程之NIO的前世今生
个人博客网:https://wushaopei.github.io/ (你想要这里多有) NIO 内容概览: NIO 网络编程模型 NIO 网络编程详解 NIO 网络编程实战 NIO 网络编程缺 ...
- Netty网络编程之NIO概览与简单应用
>>关于NIO Java NIO即Java Non-blocking IO(Java非阻塞I/O),是Jdk1.4之后增加的一套操作I/O工具包,又被叫做Java New IO. (1)R ...
- 网络编程之TCP编程
网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...
- 网络编程之socket
网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...
- [深入浅出WP8.1(Runtime)]网络编程之HttpClient类
12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, /* *TCP *建立连接,形成传输数据的通道: *在连接中进行大数据量传输: *通过三次握手 ...
- python3网络编程之socketserver
本节主要是讲解python3网络编程之socketserver,在上一节中我们讲到了socket.由于socket无法支持多用户和多并发,于是就有了socket server. socket serv ...
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
随机推荐
- Flutter移动电商实战 --(34)列表页_小BUG的修复
当高粱酒的子类没有数据返回的时候就会报错. 解决接口空数据报错的问题 没有数据的时候,给用户一个友好的提示, 我们没有数据的时候还要告诉用户,提示一下他没有数据,在我们的右侧列表的build方法内去判 ...
- 解决jenkins日志爆满 DNS查询错误
一.故障 公司的jenkins因为日志量太大把磁盘占满,进而影响了其他程序,仔细一看日志文件"/var/log/jenkins/jenkins.log"几分钟产生了30G的日志 日 ...
- kotlin标准委托之阻止属性的赋值操作
import kotlin.properties.Delegates fun main(arg: Array<String>) { val user = user() user.name= ...
- C# Socket TcpClient 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。
开始的代码: byte[] data = Encoding.UTF8.GetBytes(sInfo); tcpns.Write(data, 0,1024); 修改 ...
- cached占比过高
Linux手动释放缓存的方法Linux释放内存的命令:syncecho 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义 ...
- React Native登录注册页面实现空白处收起键盘
其实很简单,直接使用ScrollView作为父视图即可.有木有很神奇啊,以前都还不知道呢.....
- iOS——sqlite3的使用(iOS嵌入式关系数据库)
1>添加sqlite3动态库:libsqlite3.dylib,CoreGraphics.framework,UIKit.framework,Foundation.framework 2> ...
- Day04:循环结构(while、do-while、for)
Java 循环结构 - while ,do...while,for 反复执行一段相同或相似代码的格式. 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java ...
- 如何用最快的速度读出大小为10G的文件的行数?弄懂 python 的迭代器
with open('rm_keys.txt', 'r', encoding = 'utf-8') as f: count = 0 for line in f: 7 count += 1 print( ...
- JS遍历数组,实现数组去重(重复的元素只保留一个)
1.遍历数组法 它是最简单的数组去重方法(indexOf方法) 实现思路:新建一个数组,遍历去要重的数组,当值不在新数组的时候(indexOf为-1)就加入该新数组中: var arr=[2,8,5, ...