网络协议和Netty相关
文章平均质量分 86
寅灯
本人爱好互联网技术,乐观开朗,乐于助人!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java语言 Socket和ServerSocket 实战使用
5、此种实战方式,一般适合单体服务、成本低、并发量低的业务场景下;如果是服务集群、微服务、三高场景,建议使用标准的服务注册中间件。一般情况下先启动服务端,然后在启动客户端,这样放置数据丢失。2、服务器核心伪代码:SpringMVC框架的代码。1)、服务启动后就扫描执行的类。4、还有一写其他的写法和原理。1、客户端核心伪代码。2)、线程类逻辑代码。原创 2024-01-28 17:30:25 · 1248 阅读 · 1 评论 -
一台新电脑进行 Web 页面请求的历程
一台新电脑进行 Web 页面请求的历程原创 2022-07-05 14:05:12 · 926 阅读 · 0 评论 -
单机下 Netty 如何支持百万长连接
单机下 Netty 如何支持百万长连接原创 2022-07-05 13:33:09 · 2176 阅读 · 0 评论 -
500 Internal Server Error 原因及解决方案
500 Internal Server Error原创 2022-02-18 20:23:06 · 68372 阅读 · 0 评论 -
springboot集成netty实战
今天我们分享springboot集成netty的过程:1、jar包依赖,Netty服务端和客户端依赖的jar包一样:<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.28.Final</version></dependency><!-- 序列原创 2021-07-03 18:40:57 · 10407 阅读 · 2 评论 -
ByteBufAllocator 源码分析(三十四)
ByteBufAllocator ByteBufAllocator 是 Netty 内存分配最顶层的抽象,负责分配所有类型的内存。 ByteBuf buffer(); //直接分配一块内存,是使用 direct 还是 heap 取决于子类实现 ByteBuf ioBuffer(); //尽可能地分配一块堆外直接内存,如果系统不支持则分配堆内内存ByteBuf heapBuffer();// heap 内存分配 ByteBuf directBuffer();// direct 内存分配 在原创 2021-03-17 22:32:17 · 368 阅读 · 0 评论 -
浏览器中输入 url 后,发生了什么
今天我们详细分析一下,浏览器中输入 url 后,到底发生了什么?一、进行域名解析(获取IP地址)域名解析过程: 1、浏览器搜索自己的DNS缓存,缓存中维护了一张域名和IP地址的对应表 2、若没有则搜索操作系统的DNS缓存 3、若没有则操作系统将域名发送到本地域名服务器,本地域名服务器在自己的DNS缓存查找(递归查询) 4、若没有则通过以下方式查找(递归查询/迭代查询) 本地域名服务器向根域名服务器发送请求,根域名服务器返回com域顶级服务器域名地址 本地域名服原创 2021-03-04 14:35:33 · 803 阅读 · 1 评论 -
Netty单元测试解决方案(十三)
Netty单元测试解决方案一种特殊的 Channel 实现——EmbeddedChannel,它是 Netty 专门为改进针对 ChannelHandler 的单元测试而提供的。 将入站数据或者出站数据写入到 EmbeddedChannel 中,然后检查是否有任何东西到达 了 ChannelPipeline 的尾端。以这种方式,你便可以确定消息是否已经被编码或者被解码过 了,以及是否触发了任何的 ChannelHandler 动作。 writeInbound(Object... ms原创 2021-02-19 15:55:06 · 446 阅读 · 0 评论 -
Netty源码解析之ChannelInitializer(三十六)
ChannelInitializer是一种特殊的ChannelInboundHandler,可以通过一种简单的方式(调用initChannel方法)来初始化Channel。注意:当initChannel被执行完后,会将当前的handler从Pipeline中移除。执行流程,点击 ServerBootstrap 类:1、2、点击AbstractBootstrap 类:// 服务器绑定端口监听 ChannelFuture f = b.bind(port).sync();.原创 2021-03-20 19:06:51 · 1277 阅读 · 0 评论 -
PooledByteBuf 源码分析(三十五)
PooledByteBuf 是池化的 ByteBuf,提高了内存分配与释放的速度,它本身是一个抽象泛 型类,有三个子类:PooledDirectByteBuf、PooledHeapByteBuf、PooledUnsafeDirectByteBuf。 三个子类在操作上和其他的 ByteBuf 没有太大的区别,关键在于内存池化技术上。 Jemalloc 算法 Netty 的 PooledByteBuf 采用与 jemalloc 一致的内存分配算法。基本思路可用这样的情景 类比,想像一下...原创 2021-03-20 18:54:38 · 477 阅读 · 0 评论 -
ByteBuf源码分析(三十三)
当我们进行数据传输的时候,往往需要使用到缓冲区,常用的缓冲区就是 JDK NIO 类库 提供的 java.nio.Buffer。 实际上,7 种基础类型(Boolean 除外)都有自己的缓冲区实现。对于 NIO 编程而言,我 们主要使用的是 ByteBuffer。从功能角度而言,ByteBuffer 完全可以满足 NIO 编程的需要, 但是由于 NIO 编程的复杂性,ByteBuffer 也有其局限性,它的主要缺点如下。 ( 1) ByteBuffer 长度固定,一旦分配完成,它的容量不原创 2021-03-17 22:03:38 · 443 阅读 · 0 评论 -
Netty各种NioEventLoop事件的原理分析(三十二)
在前面的服务器启动代码分析中,我们可以看到,处理各种事件的其实是 NioEventLoop 中的 processSelectedKey(SelectionKey k, AbstractNioChannel ch)方法,服务端接收连接事件 按照 processSelectedKey 中的实现,read 事件和接收连接事件,都是由 unsafe.read();所 处理,这是个抽象类 NioUnsafe 的抽象 read()方法。这个抽象类的实现有两个按照类的继承关系...原创 2021-03-15 20:08:23 · 289 阅读 · 1 评论 -
Netty服务端启动源码分析(三十一)
在服务器启动的常规代码里,首先是实例化 NioEventLoopGroup 和 ServerBootstrap,然 后是各种配置。各种配置基本上就是简单的 set。 比较特别的是 channel()方法,通过查看代码我们发现, 我们传入的是一个 Class 类型 的变量,Netty 将通过反射产生 Channel 的实例。bind()方法 所以,关键代码就落在了 bind()方法上。这个方法实际调用的是 AbstractBootstrap 的 doBind()方法...原创 2021-03-08 20:34:08 · 449 阅读 · 2 评论 -
EventLoop 相关源码分析(三十)
EventLoopGroup 和 EventLoop 代码分析执行这行代码时会发生什么?,由 NioEventLoopGroup 开始,一路调用,到达 MultithreadEventLoopGroup,如果没有指定创建的线程数量,则默认创建的线程个数为 DEFAULT_EVENT_LOOP_THREADS,该数值为:处理器数量 x2。最终由 MultithreadEventExecutorGroup 实例化在这个构造方法中,实例化了每个 EventLoop ...原创 2021-03-06 21:00:21 · 219 阅读 · 1 评论 -
Unsafe 接口实现类相关源码分析(二十九)
Unsafe 是 Channel 的内部接口,聚合在 Channel 中协助进行网络读写相关的操作,因为 它的设计初衷就是 Channel 的内部辅助类,不应该被 Netty 框架的上层使用者调用,所以被 命名为 Unsafe。这里不能仅从字面理解认为它是不安全的操作,而要从整个架构的设计层 面体会它的设计初衷和职责。Unsafe 用于处理 Channel 对应网络 IO 的底层操作。ChannelHandler 处理回调事件时产 生的相关网络 IO 操作最终也会委托给 Unsa.原创 2021-03-20 18:43:04 · 439 阅读 · 0 评论 -
Channel 接口实现类系列源码之NioServerSocketChannel类分析(二十八)
主要类关系图 NioServerSocketChannelNioSocketChannelChannel 接口 Channel 是 JDK 的 NIO 类库的一个重要组成部分,就是 java.nio.SocketChannel 和 java.nio.ServerSocketChannel,它们用于非阻塞的 IO 操作。 类似于 NIO 的 Channel,Netty 提供了自己的 Channel 和其子类实现,用于异步 IO 操作 和其...原创 2021-03-20 17:50:02 · 679 阅读 · 0 评论 -
Future 和 Promise 源码分析(二十七)
从名字可以看出,Future 用于获取异步操作的结果,而 Promise 则比较抽象,无法直接 猜测出其功能。我们一一来了解。 JDK 中的 Future Future 最早来源于 JDK 的 java.util.concurrent.Future,它用于代表异步操作的结果。相关 API 如图 19-1 所示。可以通过 get 方法获取操作结果,如果操作尚未完成,则会同步阻塞当前调用的线程; 如果不允许阻塞太长时间或者无限期阻塞,可以通过带超时时间的 get 方法获取结果;如果 到达原创 2021-03-20 16:43:57 · 270 阅读 · 1 评论 -
ChannelHandler 源码分析(二十五)
ChannelHandler 类似于 Servlet 的 Filter 过滤器,负责对 I/O 事件或者 IO 操作进行拦截 和处理,它可以选择性地拦截和处理自己感兴趣的事件,也可以透传和终止事件的传递。 基于 ChannelHandler 接口,用户可以方便地进行业务逻辑定制,例如打印日志、统一封 装异常信息、性能统计和消息编解码等。 ChannelHandler 支持注解,我们常用的注解: Sharable:多个 ChannelPipeline 共用同一个 ChannelHandle原创 2021-03-20 16:26:40 · 242 阅读 · 0 评论 -
ChannelHandlerContext 相关源码分析(二十四)
ChannelHandlerContext ChannelHandlerContext 代表了一个 ChannelHandler 和 ChannelPipeline 之间的关系,Netty会把 ChannelHandler 包装进 ChannelHandlerContext 的实例 DefaultChannelHandlerContext,然后把 ChannelHandlerContext 作为元素来组成链表。所以 ChannelHandler 中一定有获得ChannelHandler 和原创 2021-03-20 16:04:27 · 395 阅读 · 1 评论 -
ChannelPipeline 源码分析(二十三)
今天开始分析Netty源码:深入 Netty 从前面对 Netty 的使用我们看到,在运行的时候,Netty 中的组件一起为基于 Netty 的网 络通信做出了贡献,所以下面我们来一一分析 Netty 中的组件,包括 ChannelPipeline、 ChannelHandlerContext、ChannelHandler 、EventLoop、Channel、Unsafe、ByteBuf 等等,并 且了解当服务器启动、当各种事件发生时 Netty 内部的运行机制。 ChannelP原创 2021-03-19 23:35:19 · 171 阅读 · 0 评论 -
JDK 中 NIO 的实现源码分析(二十二)
通过前面对 JDK 中 NIO 的学习,我们知道,NIO 中关键的几个类就是 Selector、 SocketChannel、ServerSocketChannel 和 SelectionKey,我们下面一一来学习这几个类。SocketChannel 和 ServerSocketChannel 类关系图通过对类关系图的查看,我们可以看到 SocketChannel 和 ServerSocketChannel 父类几乎 是一样的,都有 AbstractInter...原创 2021-02-27 18:03:52 · 325 阅读 · 0 评论 -
Linux 环境下的 IO 复用编程(二十一)
简介 select,poll,epoll 都是 IO 多路复用的机制。I/O 多路复用就是通过一种机制,一个进 程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序 进行相应的读写操作。但 select,poll,epoll 本质上都是同步 I/O,因为他们都需要在读写事 件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步 I/O 则无需自己负责 进行读写,异步 I/O 的实现会负责把数据从内核拷贝到用户空间。 selectint.原创 2021-02-24 14:39:29 · 228 阅读 · 0 评论 -
JDK 中的 BIO 实现原理分析(二十)
简介 对比 Linux 上网络编程,我们会发现 JDK Socket 的编程逻辑是一模一样的。实际上也 是这样,JDK 网络编程也没有做很多事,主要还是调用了 Linux 相关的函数。唯一的不同 是 Linux 是面向过程程序,socket 函数返回的是一个句柄,bind 和 listen 都是对这个句柄 的操作;而 JDK 是面向对象编程,new ServerSocket() 返回了一个对象,我们可以调用这个 serverSocket 对象的各种方法。 JDK 为我们提供了 Ser原创 2021-02-23 18:57:41 · 546 阅读 · 0 评论 -
Linux 环境下的阻塞网络编程原理(十九)
Linux 下的基础网络编程和 JDK 中的 BIO 几乎差不多,参见下面的代码:客户端和在 Java 中的客户端差不多,也要创建一个 socket 套接字,也要连接服务器,连接成 功后,进行网络的读写。服务端“”和在 Java 中的服务端差不多,也要创建一个 socket 套接字,也要绑定端口并侦听,接 受客户端的连接请求,连接建立后产生一个新的 socket 进行网络的读写。范例程...原创 2021-02-22 14:35:38 · 304 阅读 · 0 评论 -
Linux 环境网络 IO 模型原理(十八)
同步和异步,阻塞和非阻塞 同步和异步 关注的是调用方是否主动获取结果 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知, 回调函数等。 阻塞和非阻塞 主要关注的是等待结果返回调用方的状态 阻塞:是指结果返回之前,当前线程被挂起,不做任何事 非阻塞:是指结果在返回之前,线程可以做一些其他事,不会被挂起。 两者的组合 1.同步阻塞:同步阻塞基本也是编程中最常见的模型,打个比方你去商店买衣服,原创 2021-02-22 13:34:59 · 231 阅读 · 1 评论 -
WebSocket 通信原理和详细使用(十六)
什么是 WebSocket? WebSocket ——一种在 2011 年被互联网工程任务组(IETF)标准化的协议。 WebSocket 解决了一个长期存在的问题:既然底层的协议(HTTP)是一个请求/响应模 式的交互序列,那么如何实时地发布信息呢?AJAX 提供了一定程度上的改善,但是数据流 仍然是由客户端所发送的请求驱动的。还有其他的一些或多或少的取巧方式(Comet) WebSocket 规范以及它的实现代表了对一种更加有效的解决方案的尝试。简单地说, WebSocket 提原创 2021-02-20 18:38:22 · 2506 阅读 · 0 评论 -
Netty 相关服务器推送技术-短轮询和 Comet(十五)
服务器推送技术干嘛用?就是让用户在使用网络应用的时候,不需要一遍又一遍的去手 动刷新就可以及时获得更新的信息。大家平时在上各种视频网站时,对视频节目进行欢乐的 吐槽和评论,会看到各种弹幕,当然,他们是用 flash 技术实现的,对于我们没有用 flash 的 应用,一样可以实现弹幕。又比如在股票网站,往往可以看到,各种股票信息的实时刷新, 上面的这些都是基于服务器推送技术。 Ajax 短轮询 就是用一个定时器不停的去网站上请求数据。 Comet “服务器推”是一种很早就存在的原创 2021-02-20 10:04:09 · 565 阅读 · 0 评论 -
Netty相关的UDP 协议(十四)
UDP 协议 UDP 是面向无连接的通讯协议,UDP 报头由 4 个域组成,其中每个域各占用 2 个字节, 其中包括目的端口号和源端口号信息,数据报的长度域是指包括报头和数据部分在内的总字 节数,校验值域来保证数据的安全。由于通讯不需要连接,所以可以实现广播发送。 UDP 通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中 要求程序员编程验证。 UDP 与 TCP 位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP 不被应用 于那些使用虚电路的面向连原创 2021-02-19 20:34:43 · 792 阅读 · 0 评论 -
Netty序列化问题解决方案(十二)
Netty序列化问题解决方案Java 序列化的目的主要有两个: 1.网络传输 2.对象持久化当选行远程跨迸程服务调用时,需要把被传输的 Java 对象编码为字节数组或者 ByteBuffer 对象。而当远程服务读取到 ByteBuffer 对象或者字节数组时,需要将其解码为发 送时的 Java 对象。这被称为 Java 对象编解码技术。 Java 序列化仅仅是 Java 编解码技术的一种,由于它的种种缺陷,衍生出了多种编解码 技术和框架 Java 序列化的缺点 Java原创 2021-02-19 15:06:06 · 640 阅读 · 0 评论 -
Netty编解码器框架(十一)
什么是编解码器 每个网络应用程序都必须定义如何解析在两个节点之间来回传输的原始字节,以及如何 将其和目标应用程序的数据格式做相互转换。这种转换逻辑由编解码器处理,编解码器由编 码器和解码器组成,它们每种都可以将字节流从一种格式转换为另一种格式。那么它们的区 别是什么呢? 如果将消息看作是对于特定的应用程序具有具体含义的结构化的字节序列—它的数据。 那么编码器是将消息转换为适合于传输的格式(最有可能的就是字节流);而对应的解码器 则是将网络字节流转换回应用程序的消息格式。因此,编码原创 2021-02-18 13:55:47 · 312 阅读 · 0 评论 -
Netty解决粘包/半包问题(十)
回顾我们的的 Hello,Netty 参见 cn.enjoyedu.nettybasic.splicing.demo 下的代码什么是 TCP 粘包半包?假设客户端分别发送了两个数据包 D1 和 D2 给服务端,由于服务端一次读取到的字节 数是不确定的,故可能存在以下 4 种情况。 (1)服务端分两次读取到了两个独立的数据包,分别是 D1 和 D2,没有粘包和拆包; (2)服务端一次接收到了两个数据包,D1 和 D2 粘合在一起,被称为 TCP 粘包; (3...原创 2021-02-17 18:16:18 · 460 阅读 · 0 评论 -
Netty 各组件的原理分析(九)
Channel、EventLoop(Group)和 ChannelFuture Netty 网络抽象的代表: Channel—Socket; EventLoop—控制流、多线程处理、并发; ChannelFuture—异步通知。 Channel 和 EventLoop 关系如图:Channel 接口 基本的 I/O 操作(bind()、connect()、read()和 write())依赖于底层网络传输所提供的原 语。在基于 Java 的网络编程中,其基本的..原创 2021-02-17 17:23:28 · 1495 阅读 · 0 评论 -
使用Netty框架的原因和入门(八)
Netty 是什么?为什么要用 Netty? 为什么要用 Netty 1、虽然 JAVA NIO 框架提供了 多路复用 IO 的支持,但是并没有提供上层“信息格式” 的良好封装。例如前两者并没有提供针对 Protocol Buffer、JSON 这些信息格式的封装,但是 Netty 框架提供了这些数据格式封装(基于责任链模式的编码和解码功能);2、NIO 的类库和 API 相当复杂,使用它来开发,需要非常熟练地掌握 Selector、ByteBuffer、 ServerS.原创 2021-02-16 15:12:24 · 400 阅读 · 1 评论 -
原生 JDK 网络编程- NIO 之 Reactor 模式(七)
“反应”器名字中”反应“的由来: “反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而向反应器注 册一个事件处理器,表示自己对某些事件感兴趣,有时间来了,具体事件处理程序通过事件 处理器对某个指定的事件发生做出反应;这种控制逆转又称为“好莱坞法则”(不要调用我, 让我来调用你) 例如,路人甲去做男士 SPA,前台的接待小姐接待了路人甲,路人甲现在只对 10000 技 师感兴趣,但是路人甲去的比较早,就告诉接待小姐,等 10000 技师上班了或者是空闲了, 通知我。等原创 2021-02-14 22:55:17 · 240 阅读 · 0 评论 -
原生 JDK 网络编程- NIO(六)
什么是 NIO? NIO 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码 中提供了高速的、面向块的 I/O。NIO 翻译成 no-blocking io 或者 new io 都说得通。 和 BIO 的主要区别 面向流与面向缓冲 Java NIO 和 IO 之间第一个最大的区别是,IO 是面向流的,NIO 是面向缓冲区的。 Java IO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地 方。此外原创 2021-02-14 22:23:02 · 270 阅读 · 0 评论 -
原生 JDK 网络编程 BIO(五)
一些常见术语 Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。在设计模式 中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对 用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。 主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建 立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底原创 2021-02-14 13:50:52 · 225 阅读 · 0 评论 -
HTTP 协议原理(四)
HTTP HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网 (WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP 协议 我们使用 http 来访问 Web 上某个资源,比如 html/文本、word、avi 电影、其他资源。 官方协议网站:https://tools.ietf.org/html/rfc2608 HTTP 使用统一资源标识符(Uniform Resource Ide原创 2021-02-14 00:23:52 · 344 阅读 · 0 评论 -
网络抓包工具 Wireshark 和 tcpdump(三)
WireShark 为什么要抓包 1、定位网络问题; 2、分析接口数据; 3、学习网络协议,使用抓包工具分析网络数据更直观。 大部分场合都可以通过程序调试来定位问题,但有些场景使用抓包来定位接口问题更准 确、更方便,如以下场景:1、你发送数据给后台,但后台没有收到,可以对接口进行抓包分析,看是后台处理有 问题,还是没有将数据发出去,或是发送数据格式有误; 2、你和后台接口联调测通,但业务数据对不上,你认为是后台问题,后台认为是你发 的问题,可以抓包确认问题所在.原创 2021-02-13 23:02:04 · 848 阅读 · 0 评论 -
TCP三次握手和四次分手原理(二)
TCP 概述 TCP(Transmission Control Protocol)是面向连接的通信协议,通过三次握手建立连接, 然后才能开始数据的读写,通讯完成时要拆除连接,由于 TCP 是面向连接的所以只能用于端 到端的通讯。 TCP 提供的是一种可靠的数据流服务,数据有可能被拆分后发送,那么采用超时重传机 制是和应答确认机制是组成 TCP 可靠传输的关键设计。 而超时重传机制中最最重要的就是重传超时(RTO,Retransmission TimeOut)的时间选 择,很明显,原创 2021-02-12 22:41:34 · 329 阅读 · 0 评论 -
网络协议基础概念(一)
网络协议和Netty原创 2021-02-08 15:29:15 · 346 阅读 · 0 评论
分享