分享一下关于Java网络通讯方面的内容. 下载地址:https://github.com/mldn/echo
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实现的,也采用了线程池的概念。Netty的最新版本为"4.1.31",
一开始为了进一步提高Netty处理性能,所以研发了5.0版本,但是研发之后(修改了一些类名称和方法名称、通讯算法)发现性能没有比4.x提升多少。
所以Netty 5.x是暂时不会被更新的版本了,而现在主要更新的就是Netty 4.x。
在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操作。
HTTP程序开发: 在进行WEB开发过程之中,HTTP是主要的通讯协议 ,但是你千万要记住一个问题,HTTP都是基于TCP协议的一种应用,HTTP是在TCP的基础上完善出来的。 TCP是一种可靠的连接协议,所以TCP的执行性能未必会高。据说google正在开发HTTP 3.0技术标准,并且这个技术里面将使用UDP协议作为HTTP基础协议 。
HTTP里面存在有请求模式: A、HTTP 1.0:GET、POST、HEAD B、HTTP 1.1:OPTIONS、PUT、DELETE、TRACE、CONNECT 像Restful架构里面就认为这样的请求模式的区分操作非常的明智,但是从另外一个角度来讲,这样的操作实际上会非常麻烦,所以到了Spring实现的Restful架构的时候就不推荐这样的设计了。
HTTP在进行处理的时候操作分为两类数据内容:真实请求数据、头部信息(语言、浏览器内核、Cookie)。
在进行HTTP处理的时候还需要考虑到回应的操作问题:response里面给定的状态码。
Netty可以实现HTTP协议开发,但是需要注意的是,在Netty之中服务器的开发需要考虑两种不同的状态: 处理请求:HttpRequest 处理数据:HttpContent
处理Session与Cookie 服务器端应该进行session的统一管理,应该建立HttpSession的操作标准 需要设置保存在客户端的Sesson的Cookie名称。
HTTP客户端种类: 普通用户:浏览器; 正常开发者:HttpClient、Netty 数据流底层协议开发:Uri程序类完成处理。
特别说明:这是开课吧的公开课
相关推荐
Socket 是网络通信的端点,提供了进程间通信的基础。Socket 可以分为 TCP Socket 和 UDP Socket 两种,前者提供了可靠的连接,后者提供了不可靠的连接。 Unix 中的 Socket 是一种特殊的文件描述符,提供了进程间...
- **应用场景**:广泛应用于各种网络通信领域,包括但不限于游戏服务器、即时通讯系统、分布式系统等。 - **优势**:相比传统的NIO编程,Netty提供了更高级别的抽象层,降低了开发难度,同时保持了高性能和灵活性...
Socket是Java进行网络通信的基础,通过Socket,我们可以建立客户端与服务器之间的连接,进行数据交换。 总结来说,这个压缩包提供了一个学习和理解Java中不同I/O模型的起点,尤其是对于希望提升服务器性能或处理高...
3. **IO/NIO/BIO**:Java的输入输出流、非阻塞I/O和生物I/O在处理文件、网络通信时非常关键,源码可能包含这些技术的应用。 4. **反射**:Java反射机制允许程序在运行时动态地获取类的信息并调用其方法,源码中可能...
Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO(Block I/O)模型不同,NIO提供了更高效的数据处理方式,特别适合于高并发、大数据量的网络应用。在Java NIO流篇1的学习中,我们将深入...
在IT行业中,网络通信是至关重要的一个领域,而IO模型则是实现高效网络通信的基础。本篇文章将深入探讨三种主要的Java IO模型:BIO( Blocking IO)、NIO(Non-Blocking IO)和AIO(Asynchronous IO),并以代码实例...
Java网络编程是Java开发中的重要组成部分,主要用于实现应用程序之间的通信。在Java中,有三种主要的I/O模型:BIO(Blocking I/O),NIO(Non-blocking I/O)和AIO(Asynchronous I/O)。这些模型各有特点,适用于...
在Java编程领域,Socket是网络通信的基础,它允许两个或多个应用程序通过TCP/IP协议进行数据交换。本篇文章将深入探讨如何使用Java NIO(非阻塞I/O)来实现阻塞多线程通信,这对于高性能服务器端应用尤其重要。我们...
7. **输入/输出流**:Java的I/O流模型处理数据的读取和写入,包括文件操作、网络通信等。例如,InputStream和OutputStream用于处理字节流,而Reader和Writer则处理字符流。 8. **多线程**:Java内置了对多线程的...
项目采用BIO( Blocking I/O,同步阻塞输入/输出)模型进行网络通信,这是一种传统的I/O处理方式,在Java中常用于简单的并发场景。 首先,我们来了解下Java BIO的基本概念。BIO在Java中主要体现在`java.io`包下的...
### Java网络编程NIO视频教程知识点汇总 #### 1. Java NIO-课程简介 - **主要内容**:简述Java NIO(New IO)的概念及其与传统IO的区别。 - **学习目标**:理解NIO的基本原理及应用场景。 #### 2. Java NIO-概述 -...
11. **网络协议**:TCP/IP协议、HTTP/HTTPS协议,理解网络通信的基本原理,如三次握手、四次挥手、HTTP状态码、HTTPS加密过程等。 12. **分布式相关**:分布式系统的基本概念,如CAP理论、BASE理论,以及分布式缓存...
Java BIO (Blocking Input/Output) 是Java标准库中提供的一种基础网络编程模型,它主要用于创建基于TCP/IP的Socket通信服务。在这个"Java BIO Socke示例"中,我们将探讨如何使用Java BIO API来实现简单的Socket通信...
8. **网络编程**:理解TCP/IP协议,会编写Socket编程,了解HTTP协议,能使用Java实现网络通信。 9. **Spring框架**:Spring作为主流的企业级应用框架,其依赖注入、AOP、事务管理、MVC等核心概念应深入掌握。同时,...
Java网络通信系统是一种基于Java编程语言构建的网络应用程序,它允许不同设备间的高效、可靠的信息交换。本项目涵盖了从系统的设计、实现到评估的全过程,包括源代码、论文和开题报告,为学习者提供了全面的理解和...
【标题】中的“JAVA网络通信系统的研究与开发”是一个典型的IT项目主题,主要涉及的是使用Java编程语言构建网络通信系统。这个系统可能包括客户端和服务器之间的数据交换、网络协议的实现以及多线程处理等核心内容。...
5. **IO/NIO/BIO**:理解I/O流的分类、操作和转换,以及Java NIO(非阻塞I/O)的优势和使用场景。 6. **反射与动态代理**:了解如何通过反射来访问和修改类的私有属性,以及动态代理在AOP(面向切面编程)中的应用...
连接成功后,双方通过网络套接字(Socket)进行通信。在 BIO 模式下,客户端和服务端是完全同步的,完全藕合的。 Java NIO Java NIO(Non-Blocking I/O)是一种同步非阻塞式的 I/O 模式,服务器实现模式为一个线程...
BIO,即阻塞I/O模型,是Java最初提供的网络通信方式。在这种模式下,每次进行读写操作时,如果数据没有准备好,线程会被阻塞,直到数据准备好为止。这在处理少量连接时是可行的,但在高并发场景下,服务器需要为每个...
在Java编程中,IO操作是不可或缺的一部分,尤其在处理大量数据传输或者网络通信时。本文将深入探讨Java中的三种IO模型:传统IO(BIO)、非阻塞IO(NIO)以及反应器模式(Reactor),并结合提供的压缩包文件中的示例...