netty
文章平均质量分 84
Netty 是一个基于 NIO 的 client-server(客户端服务器)框架,使用它可以快速简单地开发网络应用程序。
它极大地简化并简化了 TCP 和 UDP 套接字服务器等网络编程,并且性能以及安全性等很多方面甚至都要更好。
支持多种协议如 FTP,SMTP,HTTP 以及各种二进制和基于文
Young丶
这个作者很懒,什么都没留下…
展开
-
多路复用 I/O 模型详解, 为什么他能支持更高的并发
阻塞 I/O在这种 IO 模型的场景下,我们是给每一个客户端连接创建一个线程去处理它。不管这个客户端建立了连接有没有在做事(发送读取数据之类),都要去维护这个连接,直到连接断开为止。创建过多的线程就会消耗过高的资源,以 Java BIO 为例BIO 是一个同步阻塞 IOJava 线程的实现取决于底层操作系统的实现在 linux 系统中,一个线程映射到一个轻量级进程(用户态中)然后去调用内核线程执行操作对线程的调度,切换时刻状态的存储等等都要消耗很多 CPU 和缓存资源同步:客户端请求服务端后,服原创 2021-02-20 23:29:13 · 1537 阅读 · 0 评论 -
【Netty】Netty零拷贝原理
前言理解零拷贝 零拷贝是Netty的重要特性之一,而究竟什么是零拷贝呢? WIKI中对其有如下定义:“Zero-copy” describes computer operations in which the CPU does not perform the task of copying data from one memory area to another.从WIKI的定义中,我们看到“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送原创 2021-02-05 11:43:42 · 3997 阅读 · 0 评论 -
【Netty】Netty解决粘包和拆包问题的四种方案
在RPC框架中,粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接。由于微服务往对方发送信息的时候,所有的请求都是使用的同一个连接,这样就会产生粘包和拆包的问题。本文首先会对粘包和拆包问题进行描述,然后介绍其常用的解决方案,最后会对Netty提供的几种解决方案进行讲解。1. 粘包和拆包 产生粘包和拆包问题的主要原因是,操作系统在发送TCP数据的时候,底层会有一个缓冲区,例如1024个字节大小,如果一次请求发送的数原创 2021-02-05 09:10:25 · 1024 阅读 · 1 评论 -
【Netty】Netty为什么要手动释放ByteBuf资源?
ByteBuf是Netty网络通信框架中一个重要的组件。先进和友好的设计理念让开发者受益匪浅。两个指针操作ByteBuf -> 读和写对象池技术 -> 非垃圾回收机制对象池技术对象池模式是一种软件创建设计模式,它使用一组可重用的对象 - “池” ,而不是按需分配和销毁它们。池的客户端从池中请求对象并对返回的对象执行操作。当客户端完成后,它将对象返回到池而不是销毁它,这可以手动或自动完成。在某些情况下,对象池可显着提高性能。对象池使对象生存期复杂化,因为此时实际上并未创建或销毁从池原创 2021-02-05 09:09:32 · 2114 阅读 · 1 评论 -
【Netty】option(ChannelOption.SO_KEEPALIVE, true) socket参数详解:KeepAlive
.childOption(ChannelOption.SO_KEEPALIVE, true);childOption是用来给父级ServerChannel之下的Channels设置参数的当设置为true的时候,TCP会实现监控连接是否有效,当连接处于空闲状态的时候,超过了2个小时,本地的TCP实现会发送一个数据包给远程的 socket,如果远程没有发回响应,TCP会持续尝试11分钟,直到响应为止,如果在12分钟的时候还没响应,TCP尝试关闭socket连接。keepalive不是说TCP的长连接,原创 2021-02-05 09:10:14 · 6361 阅读 · 0 评论 -
【Netty】入门Netty官方例子解析(三)处理一个基于流的传输 TCP粘包和拆包问题分析和解决
关于 Socket Buffer的一个小警告基于流的传输比如 TCP/IP, 接收到数据是存在 socket 接收的 buffer 中。不幸的是,基于流的传输并不是一个数据包队列,而是一个字节队列。意味着,即使你发送了2个独立的数据包,操作系统也不会作为2个消息处理而仅仅是作为一连串的字节而言。因此这是不能保证你远程写入的数据就会准确地读取。举个例子,让我们假设操作系统的 TCP/TP 协议栈已经接收了3个数据包:由于基于流传输的协议的这种普通的性质,在你的应用程序里读取数据的时候会有很高的可能性被分原创 2021-02-04 16:04:05 · 771 阅读 · 1 评论 -
【Netty】入门Netty官方例子解析(二)Time Server
本文承接上文《【Netty】入门Netty官方例子解析(一)写个 Discard Server》官网文档,Netty入门官方例子第二个例子 Time Server原文这个章节,是为了构建一个模拟时间服务器的代码,可以供其他客户端查询时间,可以通过rdate(后文有解释)命令来验证。import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.Chann原创 2021-02-04 15:33:44 · 834 阅读 · 1 评论 -
【Netty】入门Netty官方例子解析(一)写个 Discard Server
本文以Netty官方给出的列子来讲解Netty带你一步步进入Netty。Netty最全教程在这里Getting Started版本 netty4maven依赖:<!-- https://mvnrepository.com/artifact/io.netty/netty-all --><dependency> <groupId>io.netty</groupId> <artifactId>netty-all</arti原创 2021-02-04 15:13:44 · 784 阅读 · 0 评论 -
【Netty 】Netty fireChannelRead用法
概述fireChannelRead表示传递消息至下一个处理器,因为pipline的原因,我们可能有一个链式的处理队列,这个队列有头和尾之分,那么消息通常从头处理器进入。假设现有队列A、B、C,一条消息消息首先进入A,如果A不显示调用fireChannelRead将消息传递至B的话,那么B和C永远收不到消息。我们来看个例子:public class AHandler extends ChannelInboundHandlerAdapter { public void channelRead(Chan原创 2021-02-04 14:29:22 · 5534 阅读 · 2 评论 -
【Netty】手把手教你实现自己的第一个 Netty 应用
下面,我会带着大家搭建自己的第一个 Netty 版的 Hello World 小程序。首先,让我们来创建服务端。服务端我们可以通过 ServerBootstrap 来引导我们启动一个简单的 Netty 服务端,为此,你必须要为其指定下面三类属性:线程组(一般需要两个线程组,一个负责处理客户端的连接,一个负责具体的 IO 处理)IO 模型(BIO/NIO)自定义 ChannelHandler (处理客户端发过来的数据并返回数据给客户端)创建服务端public final class Hel原创 2021-02-04 13:35:39 · 789 阅读 · 0 评论 -
【Netty】大白话 Netty 核心组件分析
Bytebuf(字节容器)网络通信最终都是通过字节流进行传输的。 ByteBuf 就是 Netty 提供的一个字节容器,其内部是一个字节数组。 当我们通过 Netty 传输数据的时候,就是通过 ByteBuf 进行的。我们可以将 ByteBuf 看作是 Netty 对 Java NIO 提供了 ByteBuffer 字节容器的封装和抽象。有很多小伙伴可能就要问了 : 为什么不直接使用 Java NIO 提供的 ByteBuffer 呢?因为 ByteBuffer 这个类使用起来过于复杂和繁琐。Bo原创 2021-02-04 11:39:13 · 913 阅读 · 0 评论 -
【Netty】什么是编码器和解码器?
什么是编码器和解码器?从网络传输的角度来讲,数组总是以字节的格式在网络之中进行传输的。 每当源主机发送数据到目标主机时,数据会从本地格式被转换成字节进行传输,这种转换被称为编码,编码的逻辑由编码器处理。 每当目标主机接受来自源主机的数据时,数据会从字节转换为我们需要的格式,这种转换被称为解码,解码的逻辑由解码器处理。在Netty中,编码解码器实际上是ChannelOutboundHandler和ChannelInboundHandler的实现, 因为编码和解码都属于对数据的处理,由此看来,编码解码器被设原创 2021-02-04 11:33:34 · 1470 阅读 · 0 评论 -
【Netty】Bootstrap引导
Bootstrap引导在了解ChanelPipeline,EventLoop等组件之后,我们需要将这些组件组织起来,使其成为一个可运行的应用程序。 这里就需要引导这些组件了。Bootstrap类引导类的层次结构包括一个抽象的父类和两个具体的引导子类:ServerBootstrap总是需要一个ServerSocketChannel来处理客户端的连接通信,而 Bootstrap则只需要一个普通的Channel用于与服务端的通信。下面是AbstractBootstrap的主要方法:方法描述原创 2021-02-04 11:21:52 · 754 阅读 · 0 评论 -
【Netty】Netty线程模型和EventLoop
Netty线程模型和EventLoop由于线程模型确定了代码执行的方式,它可能带来一些副作用以及不确定因素, 可以说这是并发编程中最大的难点,因此,我们需要了解Netty所采用的线程模型,这样 在遇到相关问题时不至于手足无措。线程模型概述现代操作系统几乎都具有多个核心的CPU,所以我们可以使用多线程技术以有效地利用系统资源。在早期的 Java多线程编程中,我们使用线程的方式一般都是继承Thread或者实现Runnable以此创建新的Thread, 这是一种比较原始且浪费资源的处理线程的方式。JDK5之原创 2021-02-04 11:16:25 · 784 阅读 · 0 评论 -
【Netty】ChannelHandler和ChannelPipeline
ChannelHandler和ChannelPipeline在Netty组件中我们已经介绍了ChannelHandler和ChannelPipeline的关系,这里我们将继续深入了解这两个核心 组件的细节。在学习本章内容之前,请各位同学温习一遍Netty组件部分的内容。ChannelHandler家族Channel的生命周期在Channel的生命周期中,它的状态与ChannelHandler是密切相关的,下列是Channel组件的四个状态:状态描述ChannelUnregist原创 2021-02-04 10:21:35 · 2660 阅读 · 2 评论 -
【Netty】ByteBuf--Netty的数据容器
ByteBuf–Netty的数据容器网络传输的基本单位是字节,在Java NIO中,JDK提供了Buffer接口,以及其相关的实现作为NIO操作 数据的容器,如ByteBuffer等等。 而Netty为了解决Buffer原生接口的复杂操作提供了ByteBuf, ByteBuf是一个很好的经过优化过的数据容器,我们可以将字节数据添加到ByteBuf中或从ByteBuf中获取数据, 相比于原生Buffer,ByteBuf更加灵活和易用。Netty的数据处理主要通过两个API提供:abstract cla原创 2021-02-03 20:53:05 · 965 阅读 · 0 评论 -
【Netty】传输(Transport)
传输(Transport)在网络中传递的数据总是具有相同的类型:字节。 这些字节流动的细节取决于网络传输,它是一个帮我们抽象 底层数据传输机制的概念,我们不需要关心字节流动的细节,只需要确保字节被可靠的接收和发送。当我们使用Java网络编程时,可能会接触到多种不同的网络IO模型,如NIO,BIO(OIO: Old IO),AIO等,我们可能因为 使用这些不同的API而遇到问题。 Netty则为这些不同的IO模型实现了一个通用的API,我们使用这个通用的API比直接使用JDK提供的API要 简单的多,且避原创 2021-02-03 19:24:22 · 1055 阅读 · 0 评论 -
【Netty】Netty组件介绍
Netty组件介绍Netty有 Bootstrap/ServerBootstrap,Channel,EventLoop,ChannelFuture,ChannelHandler,ChannelPipeline,编码器和解码器等核心组件。Bootstrap/ServerBootstrapBootstrap和ServerBootstrap是Netty应用程序的引导类,它提供了用于应用程序网络层的配置。一般的Netty应用程序总是分为客户端和服务端,所以引导分为客户端引导Bootstrap和服务端引导S原创 2021-02-03 18:19:58 · 731 阅读 · 0 评论 -
【Netty】从 BIO、NIO 聊到 Netty
是什么?有哪些特点?有哪些应用场景?有哪些成功使用的案例?…为了让你更好地了解 Netty 以及它诞生的原因,先从传统的网络编程说起吧!还是要从 BIO 说起传统的阻塞式通信流程早期的 Java 网络相关的 API(java.net包) 使用 Socket(套接字)进行网络通信,不过只支持阻塞函数使用。要通过互联网进行通信,至少需要一对套接字:运行于服务器端的 Server Socket。运行于客户机端的 Client SocketSocket 网络通信过程如下图所示:【.原创 2021-02-02 17:27:30 · 1371 阅读 · 0 评论