网络编程之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 ...
随机推荐
- 如何隐藏EFI分区?
U盘制作PE 后多了个EFI分区, 傲梅分区助手,,里面可以进行隐藏分区 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- 启动elasticsearch的时候报出Exception in thread "main" SettingsException[Failed to load settings from /usr/local/elasticsearch/config/elasticsearch.yml]; nested: MarkedYAMLException[while scanning a simple ke
故障现象: [elasticsearch@tiantianml- ~]$ /usr/local/elasticsearch/bin/elasticsearch Exception in thread ...
- charles-mock数据的方法(有空自己写一个)
https://www.jianshu.com/p/75d24f264ce2 这个也可以参考下 https://www.cnblogs.com/kaibindirver/p/9104996.html ...
- php 转化整型需要注意的地方
public function tt(){ $num = '19.90'; echo $num; echo '<br/>--------------<br/>'; echo 1 ...
- ubuntu下virtualbox的安装、卸载
一.添加VirtualBox的源并安装5.1版本 virtualbox官网:https://www.virtualbox.org/wiki/Download_Old_Builds 虽然也可以直接安装d ...
- save()和savaorupdate的区别
hibernate的保存 hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,在这里细说一下,以便区别: 一.预备知识: 在所有之前,说明一下,对于hibernate,它的对 ...
- Spring Security(20)——整合Cas
整合Cas 目录 1.1 配置登录认证 1.1.1 配置AuthenticationEntryPoint 1.1.2 配置CasAuthenticationFilt ...
- Spring Boot后台运行
#!/bin/bash nohup java -jar -Dspring.profiles.active=prop app-0.0.1.jar > app.log 2>&1 &am ...
- IDEA配置SpringBoot应用的profile启动参数
参考博客:https://blog.csdn.net/li396864285/article/details/83576829 如图为, 配置多台eureka的启动参数, 分别为: --spring. ...
- Volatility取证使用笔记
最近简单的了解了一下Volatility这个开源的取证框架,这个框架能够对导出的内存镜像镜像分析,能过通过获取内核的数据结构,使用插件获取内存的详细情况和运行状态,同时可以直接dump系统文件,屏幕截 ...