Java网络通信方面,BIO、NIO、AIO、Netty
码云项目源码地址:https://gitee.com/ZhangShunHai/echo
教学视频地址:链接: https://pan.baidu.com/s/1knVlW7O8hZc8XgXm1dCt5Q 提取码: b8o0
关于Java网络通讯方面的内容. Java基础知识:BIO、NIO、AIO三者的技术实现,以及彼此之间的区别 Netty:TCP 程序实现为主
代码的核心:Echo程序模型,通过网络实现一个基础的Echo。
一、BIO模型:同步阻塞IO处理
在程序的开发之中Java里面最小的处理单元就是线程,也就是说每一个线程可以进行IO的处理, 在处理之中,该线程无法进行任何的其他操作。 多线程是不可能无限制进行创造的, 所以需要去考虑堆线程进行有效的个数控制。如果产生的线程过多, 那么直接的问题在于,处理性能降低 ,响应的速度变慢。 需要去区分操作系统的内核线程,以及用户线程的区别, 所以最好与内核线程有直接联系,需要使用到固定线程池。
【BIO】现在烧水,意味着你现在需要一直盯着水壶去看, 一直看它已经烧为止,在这之中你什么都干不了。
二、NIO模型:同步非阻塞IO处理
在传统的Java环境里面,最初的程序需要依赖于JVM虚拟机技术。 最早的时候由于虚拟机的性能很差,所以很少有人去关注通讯的速度问题, 大部分的问题都出现在了CPU处理上。 但是随着硬件的性能提升, 实际上CPU的处理速度加强了。所以从JDK 1.4开始就引入NIO的开发包, 可以带来底层数据的传输性能。 在NIO之中采用了一个Reactor事件模型, 注册的汇集点Selector
【NIO】烧水,不会一直傻站着看,你采用轮询的方式来观察水是否烧开。
三、AIO模型:异步非阻塞IO、是在JDK 1.7的时候才推出的模型。
是利用了本地操作系统的IO操作处理模式,当有IO操作产生之后, 会启动有一个单独的线程,它将所有的IO操作全部交由系统完成, 只需要知道返回结果即可。 主要的模式是基于操作回调的方式来完成处理的,
如果以烧水为例:在烧水的过程之中你不需要去关注这个水的状态, 在烧水完成后才进行通知。
之所以在整个的开发之中去使用系统实现的程序类,核心的意义在于: 它可以帮助开发者隐藏协议的实现细节, 但是在开发中依然会发现有如下几点:
1、程序的实现方式上的差异,因为代码的执行会有底层的实现琐碎问题;
2、在现在给定的通讯里面并没有处理长连接的问题, 也就是说按照当前编写的网络通讯,一旦要发送的是稍微大一些的文件, 则很大可能是无法传送完成;
3、在数据量较大的时候需要考虑粘包与拆包问题;
4、实现的协议细节操作不好控制;
5、在很多项目开发中(RCP底层实现)需要提供有大量的IO通讯的问题, 如果直接使用原始的程序类,开发难度过高;
Netty的产生也是符合时代的要求,可以简化大量的繁琐的程序代码,官网:https://netty.io/
Dubbo使用了Netty作为底层的通讯实现,Netty是基于NIO实现的,也采用了线程池的概念。
在AIO的模型里面,会发现都采用了回调的处理形式, 所以在Netty里面是基于状态的处理形式, 例如:连接成功、信息的读取、失败等操作都会由一系列的状态方法来进行定义的。
Netty可以实现HTTP处理机制,但是Tomcat本身也是基于NIO的实现。
如果在实现Netty的过程之中只是进行这些简单的NIO包装处理实际上是没有任何优势的。 Netty的出现是为了解决传输问题,最为重要的情况就是粘包与拆包。
1、如果现在数据稍微有点大(又不是很大的时候), 那么如果要进行多条数据的发送(缓冲区有大小限制);
2、粘包和拆包的问题解决方案有如下几种:
A、设置消息的边界内容,例如:每一个消息使用"\n"结尾操作;
B、使用特定消息头,在真实信息之前传入一个长度的信息。
C、使用定长信息;
3、Netty解决拆包与粘包问题的关键在于使用了分割器的模式来进行数据的拆分。
4、Netty默认分隔符是系统提供的分隔符常量,需要考虑分隔符的定义问题。
5、序列化管理操作:Java原生实现(性能比较差)、JSON(Restful)、MessagePack、Marshalling、AVRO、....
netty本身直接支持有原生的 Java序列化操作,直接配置已有的程序类即可
MessagePack:类似于JSON,但是要比JSON传输的更加小巧同时速度也快。它定义一个自己的压缩算法, 例如:boolean只有true和false, 但是有了MP就可以通过0和1描述了;
Marshalling:使用JBoss实现的序列化处理操作, 是基于传统的Java序列化的形式的一种升级。
JSON:是一种标准做法,但是JSON需要清楚的问题是传输体积要大, 但是传输的信息明确, 本次使用FastJSON操作
Java网络通信方面,BIO、NIO、AIO、Netty的更多相关文章
- IO回忆录之怎样过目不忘(BIO/NIO/AIO/Netty)
有热心的网友加我微信,时不时问我一些技术的或者学习技术的问题.有时候我回微信的时候都是半夜了.但是我很乐意解答他们的问题.因为这些年轻人都是很有上进心的,所以在我心里他们就是很优秀的,我愿意多和努力的 ...
- JAVA中的BIO,NIO,AIO
在了解BIO,NIO,AIO之前先了解一下IO的几个概念: 1.同步 用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪, 例如自己亲自出马持银行卡到银行取钱 2.异步 用户触发IO操作以后, ...
- Java提供了哪些IO方式?IO, BIO, NIO, AIO是什么?
IO一直是软件开发中的核心部分之一,而随着互联网技术的提高,IO的重要性也越来越重.纵观开发界,能够巧妙运用IO,不但对于公司,而且对于开发人员都非常的重要.Java的IO机制也是一直在不断的完善,以 ...
- 3. 彤哥说netty系列之Java BIO NIO AIO进化史
你好,我是彤哥,本篇是netty系列的第三篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 上一章我们介绍了IO的五种模型,实际上Java只支持其中的三种,即BIO/NIO/ ...
- 【netty】(1)---BIO NIO AIO演变
BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Net ...
- Netty序章之BIO NIO AIO演变
Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...
- (转)也谈BIO | NIO | AIO (Java版)
原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...
- 也谈BIO | NIO | AIO (Java版--转)
关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...
- java BIO/NIO/AIO 学习
一.了解Unix网络编程5种I/O模型 1.1.阻塞式I/O模型 阻塞I/O(blocking I/O)模型,进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误 ...
- BIO | NIO | AIO (Java版)
几篇解释的不错的文章: BIO NIO AIO NIO.2 入门,第 1 部分: 异步通道 API 使用异步 I/O 大大提高应用程序的性能
随机推荐
- RCNN系列算法的发展
一. RCNN系列的发展 1.1 R-CNN 根据以往进行目标检测的方法,在深度学习应用于目标检测时,同样首先尝试使用滑动窗口的想法,先对图片进行选取2000个候选区域,分别对这些区域进行提取特征以 ...
- Css预处理器---Less(一)
一.简介: Less是一种动态样式语言,可以在样式中使用变量,继承,运算,函数 二.使用 (1)客户端使用 //引入您的.less样式文件,rel属性区别去css为stylesheet/less &l ...
- 并查集(disjoint)
合并,查找的集合 第一,建立两个函数,一个用来查找(find),一个用来合并(merge): 如下的一个模板: 题目: 亲戚(Relations) 或许你并不知道,你的某个朋友是你的亲戚.他可能是你的 ...
- Oracle / PLSQL函数 - DECODE
1.DECODE( expression , search , result [, search , result]... [, default] ) 参数说明: expression : 表中的某一 ...
- 01 while 循环输入1 2 3 4 5 6 8 9 10
start = 1while True: if start == 7: start += 1 continue print(start) start ...
- html5-相对定位
*{ margin: 0px; padding: 0px;}div{ width: 300px; height: 300px;}#div1{ background: rg ...
- PYQT5学习笔记之各模块介绍
Qtwidgets模块包含创造经典桌面风格的用户界面提供了一套UI元素的类 Qtwidegts下还有以下常用对象,所以一般使用Qtwidegts时会使用面向对象式编程 QApplication: ap ...
- 给本体ONT技术社区的第一封公开信-涉及到不少区块链技术知识
给本体ONT技术社区的第一封公开信-涉及到不少区块链技术知识 共识是区块链的核心机制,在一系列的区块链的发展历史当中,PoW/PoS/BFT等系列的共识算法都在各自的应用场景发挥了不同作用.在本体的第 ...
- NodeJS,JavaScript正在吞噬这个世界
NodeJS,JavaScript正在吞噬这个世界 NodeJS,一个基于Google Chrome V8 JS引擎的服务器端JavaScript运行时,曾经被认识只是一个赶时髦的技术,有谁会想到,它 ...
- [转载]window.location.href的用法(动态输出跳转)
无论在静态页面还是动态输出页面中window.location.href都是不错的用了跳转的实现方案 javascript中的location.href有很多种用法,主要如下. self.loca ...