
网络编程&netty
文章平均质量分 83
aa
云川之下
这个作者很懒,什么都没留下…
展开
-
【Netty】ByteBuffer的原理和使用详解
a原创 2022-07-28 13:50:26 · 4830 阅读 · 0 评论 -
netty的线程池(揭示了使用两个线程池的原因)&知识汇总
线程模型是Netty的核心设计,设计地很巧妙,之前项目中有一块处理并发的设计和Netty的Eventloop单线程设计类似,效果得到了实证。Netty5的类层次结构和之前的版本变化很大,网上也有很多文章写Netty的线程模型,Reactor模式,比如这篇http://blog.csdn.net/xiaolang85/article/details/37873059, 应该是引自《Netty权威指南》,写得比较全面,但是有几个关键的概念没讲清楚。这篇文章只讲Netty5线程模型最重要的几个关键点理解Ni转载 2021-12-31 14:16:42 · 3537 阅读 · 0 评论 -
【netty】ChannelPipeline、ChannelHandlerContext、AbstractChannelHandlerContext、DefaultChannelPipeline
文章目录前言1. ChannelHandler2. ChannelPipeline3. ChannelHandlerContext3.1 AbstractChannelHandlerContext3.2 DefaultChannelHandlerContext4. 几者关系参考前言我们一般定义一个Handler,在channelRead0()的入参中,有ChannelHandlerContext 对象ctx:public class HttpServerHandler extends SimpleCh转载 2021-12-21 14:32:27 · 345 阅读 · 0 评论 -
【Netty】 ChannelHandler的生命周期
文章目录前言主要接口核心生命周期方法生命周期总结前言在使用Netty进行网络编程的时候,通常需要在网络连接的不同阶段进行相应的操作,比如在连接建立时,客户端向服务端发起认证,在接收到数据时对数据内容进行解析等等。那么,连接的不同阶段在netty中如何表示呢?首先我们先分析下网络连接的生命周期:连接建立 —> 数据交互 —> 连接断开。在数据交互阶段,包括从连接中读取数据和向连接中写入数据。知道了连接的生命周期,就可以按图索骥的在各个阶段进行想要的操作。而在 Netty 中,网络连接的不转载 2021-06-17 10:23:11 · 1001 阅读 · 0 评论 -
JDK 1.4 NIO 库知识
参考《Java NIO》转载 2021-06-17 09:55:27 · 255 阅读 · 0 评论 -
【netty4】Netty零拷贝的实现原理
文章目录1. 概述2. 传统方法,非零拷贝3. 零拷贝方法3.1 初识transferTo()3.2 sendfile函数参考1. 概述零拷贝的应用程序要求内核(kernel)直接将数据从磁盘文件拷贝到套接字(Socket),而无须通过应用程序。零拷贝不仅提高了应用程序的性能,而且减少了内核和用户模式见上下文切换。2. 传统方法,非零拷贝我们举个例子,从磁盘文件中读取数据,并将数据传输到网络上的另一个程序的场景:从下图可以看出,拷贝的操作需要4次用户模式和内核模式之间的上下文切换,而且在操作完成前数转载 2021-06-16 15:28:29 · 669 阅读 · 0 评论 -
【Netty4】直接内存
文章目录1. 什么是直接内存2. 直接内存分配源码分析3. 使用直接内存的优缺点:1. 什么是直接内存直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,某些情况下这部分内存也会被频繁地使用,而且也可能导致OutOfMemoryError异常出现。Java里用DirectByteBuffer可以分配一块直接内存(堆外内存),元空间对应的内存也叫作直接内存,它们对应的都是机器的物理内存。package com.test;import原创 2021-06-16 14:12:14 · 812 阅读 · 0 评论 -
【Netty源码分析摘录】(九)backlog(最大连接数)与TCP三次握手之间不得不说的事
文章目录1. 前言2. TCP 三次握手2.1 半连接队列和全连接队列3. backlog 与 TCP 的三次握手3.1 半连接队列3.1.1 SYN-Flood攻击3.2 全连接队列3.2.1 工具4. 总结1. 前言前段时间在学习 netty 源码的时候,遇到了一个知识点:在服务端套接字创建的过程中,可以通过 option() 方法为服务端 channel 设置 TCP 相关的参数,例如:ChannelOption.SO_BACKLOG,该参数就是设置 tcp 的 backlog 属性的值(示例代转载 2021-06-15 22:50:43 · 3039 阅读 · 0 评论 -
【Netty】手写Netty
文章目录1. 目的2 手写netty架构的nio代码2.1 单线程的nio架构2.2 改写为多线程架构3. 原理分析4. 总结1. 目的我们知道Netty优点很多以及netty原理的底层机制,但是是否真正理解呢?如果真的理解了那么自然回答出一下几个问题:1.你能看的懂netty源码吗2.你能讲出netty源码的架构吗3.netty中的NioEventLoop对应一个线程,并绑定了一个selector,为何主Reactor中的NioEventLoop可以负责接收请求,而从Reactor中的NioE原创 2021-06-15 15:13:20 · 1124 阅读 · 0 评论 -
【Netty源码分析摘录】(四)服务端Channel注册
文章目录问题上篇回顾register(channel)源码总结问题在JDK的原生NIO的写法中,通过serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT)将服务端channel注册到多路复用器selector上,那么在Netty中,又是如何将NioServerSocketChannel注册到多路复用器上的呢?在注册过程中,Netty又额外做了哪些事情呢?在上一篇文章【Netty源码分析摘录】(三)服务端Channel初始化中,转载 2021-06-11 13:02:27 · 581 阅读 · 0 评论 -
【Netty源码分析摘录】(八)新连接的接入
文章目录1.问题1.问题当 netty 的服务端启动以后,就可以开始接收客户端的连接了。那么在 netty 中,服务端是如何来进行新连接的创建的呢?在开始进行源码阅读之前,可以先思考以下三个问题。服务端是如何检测到有新的客户端请求接入的(后面简称新连接接入)?-在 JDK 原生的 NIO 中,服务端会通过ServerSocketChannel.accept() 来为新接入的客户端创建对应的客户端 channel,那么在 netty 中服务端又是如何来处理新连接的接入的呢?在 netty 中网络转载 2021-06-11 10:48:45 · 455 阅读 · 0 评论 -
【Netty源码分析摘录】(七)NioEventLoop的执行流程 & 空轮询bug
文章目录1.前言2.NioEventLoop.run()3.轮询事件(select())4.JDK 空轮询的 BUG5.处理网络 IO(processSelectedKeys())6.处理任务(runAllTasks())7.总结1.前言在上一篇文章中分析了NioEventLoop的创建以及启动过程的源码,在文章结尾处提到,当NioEventLoop线程启动以后,会一直在一个无限 for 循环中一直循环,至死方休,那么在循环中,NioEventLoop到底在循环处理什么呢?这将是本文分析的重点。同时,还转载 2021-06-10 22:22:22 · 613 阅读 · 0 评论 -
【Netty源码分析摘录】(六)NioEventLoop的创建与启动
文章目录前言功能说明创建流程创建线程执行器创建 NioEventLoop线程执行器选择工厂启动总结前言前三篇文章分别分析了 Netty 服务端 channel 的初始化、注册以及绑定过程的源码,理论上这篇文章应该开始分析新连接接入过程的源码了,但是在看源码的过程中,发现有一个非常重要的组件:NioEventLoop,出现得非常频繁,以至于影响到了后面源码的阅读,因此决定先分析下NioEventLoop的源码,再分析新连接接入的源码。关于NioEventLoop这个组件的源码分析,将会写两篇文章来分享。转载 2021-06-10 18:16:24 · 412 阅读 · 0 评论 -
【Netty源码分析摘录】(五)服务端Channel的端口绑定
另一篇文章已经参考过了《Netty服务端启动源码分析(二)服务端Channel的端口绑定》转载 2021-06-10 16:44:21 · 395 阅读 · 0 评论 -
【Netty源码分析摘录】(三)服务端Channel初始化
文章目录问题组件说明服务端启动channel初始化总结问题Netty作为一款基于事件驱动的高性能网络框架,其底层实际上仍然使用的是JDK里面的NIO,Netty在JDK的NIO上做了大量优化,以及封装,降低了开发人员使用NIO的难度。使用JDK原生的NIO进行网络编程时,首先得做两件事:创建以及初始化ServerSocketChannel将ServerSocketChannel绑定到多路复用器Selector上。既然说Netty对JDK的NIO做了封装,那么在Netty中是什么时候进行这两步转载 2021-06-10 16:33:26 · 531 阅读 · 0 评论 -
【Netty源码分析摘录】(二)Netty源码分析系列之Reactor线程模型
文章目录前言1. BIO线程模型2. Reactor模型2.1 Reactor单线程模型2.2 Reactor多线程模型2.3 Reactor主从多线程模型3. Netty对Reactor三种线程模型的支持3.1 在Netty中使用Reactor单线程模型3.2 在Netty中使用Reactor多线程模型3.3在Netty中使用Reactor主从多线程模型4. 总结前言对于网络编程而言,一方面需要保证基本功能的正确性,另一方面还需要保证程序的高性能。而网络程序高性能的主题之一就是网络IO,不同的IO模型转载 2021-06-10 13:42:30 · 444 阅读 · 0 评论 -
【Netty源码分析摘录】(一)如何从BIO演进到NIO,再到Netty
文章目录前言BIONIONetty总结前言结合我自身学习Netty的经历,在正式进入Netty的源码分析,决定有必要先说说BIO、NIO的关系。在平时工作中,很少直接写网络编程的代码,即使要写也都是使用成熟的网络框架,很少直接进行Socket编程。下面将结合一个Demo示例,来熟悉下网络编程相关知识。在Demo示例中,客户端每隔三秒向服务端发送一条Hello World的消息,服务端收到后进行打印。BIOBIO是阻塞IO,也称之为传统IO,在Java的网络编程中,指的就是ServerSocket、S转载 2021-06-10 10:28:53 · 325 阅读 · 0 评论 -
【Netty4】Netty核心组件之NioEventLoop(二)处理消息
aa原创 2021-06-09 23:25:33 · 323 阅读 · 0 评论 -
【Netty4】Netty服务端启动源码分析(一)
http://ifeve.com/netty-reactor-4/https://blog.csdn.net/huanshirenjian/article/details/90228894原创 2021-06-09 23:24:41 · 352 阅读 · 0 评论 -
【Netty4】Netty服务端启动源码分析(二)服务端Channel的端口绑定
文章目录文章目的Netty实现总结文章目的由于 Netty 是对 JDK 原生 NIO 的封装,对比 JDK 原生 NIO 的写法,我们可以先思考一下以下两个问题。在 JDK 原生 NIO 写法中,会调用 serverSocketChannel.bind(new InetSocketAddress(port)) 进行端口号的绑定,那么在 Netty 中,绑定端口号的操作又是在什么地方实现的呢?在 JDK 原生的 NIO 写法中,在将 ServerSocketChannel 注册到多路复用器转载 2021-06-09 23:12:53 · 404 阅读 · 0 评论 -
【Netty4】netty对selectedKeys进行优化
文章目录1. 我们的问题2. 问题分析1. 我们的问题netty在创建selector的时候就尝试了优化,具体优化其实是将底层的数据结构从HashSet改为了数组,可以从SelectedSelectionKeySet和SelectorImpl的源码看到这一点,这里就不列了。记住有个优化就行了,下面会用到这个知识但是由此引发一个问题,当开启优化后,那么有效连接集合的数据是从哪来的?当IO事件发生后,会紧接着调用processSelectedKeys()来处理具体的IO消息:public fin原创 2021-06-09 14:20:12 · 852 阅读 · 3 评论 -
【Netty4】Netty核心组件之NioEventLoop(一)创建
文章目录1. 开篇2. 类继承关系以及重要的成员变量2.1 类继承关系2.2 重要的成员变量2.3 构造函数2.4 run方法解析总结1. 开篇NioEventLoop是Netty框架的Reactor线程;NioEventLoop负责处理注册在其上面的所有Channel的IO事件,通常情况下一个NioEventLoop会下挂多个Channel;NioEventLoop同时会负责通过execute方法提交的任务,以及通过schedule方法提交的定时任务;在接下来几篇文章,我会通过Netty的源原创 2021-06-09 00:41:52 · 643 阅读 · 3 评论 -
【Netty4】Netty心跳检测机制2 IdleStateHandler原理分析
文章目录1. Netty心跳检测机制2. 源码分析系列文章:《Netty心跳检测机制1 IdleStateHandler示例》《Netty心跳检测机制2 IdleStateHandler原理分析》1. Netty心跳检测机制所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性。在 Netty 中, 实现心跳机制的关键是 IdleStateHandler, 看下它的构造器: public IdleStateHa原创 2021-06-02 14:20:28 · 995 阅读 · 2 评论 -
【Netty4】Netty心跳检测机制1 IdleStateHandler示例
文章目录1. 概述2. 超时样例2.1 代码2.2 执行3. 不超时演示3.1 修改代码3.2 执行4. 参考系列文章:《Netty心跳检测机制1 IdleStateHandler示例》《Netty心跳检测机制2 IdleStateHandler原理分析》1. 概述所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性。在 Netty 中, 实现心跳机制的关键是 IdleStateHandler, 看下它的构造器原创 2021-06-02 13:17:42 · 557 阅读 · 0 评论 -
netty权威指南(第二版)对应的源码
《netty权威指南(第二版)对应的源码》 一个哥们创建的git库《源码原始地址》有关该书的更多信息可以关注李林峰老师的在ifeve网站上的文章:http://ifeve.com/author/linfeng/原创 2021-06-02 10:44:10 · 574 阅读 · 0 评论 -
【Netty4】自定义编码解码器ByteToMessageDecoder、MessageToByteEncoder
文章目录1. 概述2. 代码2.1 MyMessageEncoder自定义编码器2.2 MyMessageDecoder自定义解码器2.3 自定义协议包2.4 服务端代码2.5 客户端代码2.6 执行系列文章:《粘包拆包样例 & DelimiterBasedFrameDecoder》《自定义编码解码器ByteToMessageDecoder、MessageToByteEncoder》1. 概述经过《粘包拆包样例 & DelimiterBasedFrameDecoder》,我们知道什原创 2021-06-01 17:38:04 · 4980 阅读 · 0 评论 -
【Netty】SimpleChannelInboundHandler和ChannelInboundHandlerAdapter
文章目录1. 类的关系1.1 SimpleChannelInboundHandler1.2 ChannelInboundHandlerAdapter1. 类的关系如下就是两个类的声明,SimpleChannelInboundHandler是继承 ChannelInboundHandlerAdapter的。也就是说SimpleChannelInboundHandler 也拥有 ChannelInboundHandlerAdapter的方法。//ChannelInboundHandlerAdapter 类原创 2021-06-01 16:33:18 · 2922 阅读 · 0 评论 -
【Netty4】ByteBuf是什么
文章目录参考:《ByteBuf 详解(一)》转载 2021-05-21 16:04:56 · 333 阅读 · 0 评论 -
【Netty4】入门例子
文章目录1. 配置依赖2. 服务端代码3. 客户端代码4. 执行1. 配置依赖<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.1.Final</version></dependency>2. 服务端代码NettyServer :package netty.test;原创 2021-05-18 14:32:38 · 241 阅读 · 0 评论 -
【rpc ssl认证、证书】http请求忽略证书、单向认证、双向认证、连接池范例(httpclient 4.3.x以上版本)
文章目录1. 加载证书单向认证2. 忽略证书3. 双向认证4. 连接池1. 加载证书单向认证import org.apache.http.HttpEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;impo转载 2021-03-11 09:49:09 · 1371 阅读 · 0 评论 -
【ssl认证、证书】SSL双向认证和SSL单向认证的区别(示意图)
双向认证 SSL 协议要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有CA证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响 SSL 过程的安全性)密码方案。这样,双方具体的通讯内容,就是加过密的数据,如果有第三方攻击,获得的只是加密的数据,第三方要获得有用的信息,就需要对加密的数据进行解密,这时候的安全就依赖于密码方案的安全。而幸运的是,目前所用的密码方案,只要通讯密钥长度足够的长,转载 2021-03-10 16:06:57 · 5508 阅读 · 0 评论 -
【网络编程socket】java NIO编程示例以及流程详解
参考:《java NIO示例以及流程详解》转载 2020-12-18 13:11:58 · 1283 阅读 · 0 评论 -
【网络编程socket】BIO & Socket和ServerSocket API & 入门例子
文章目录概述1、构造ServerSocket1.1 、绑定端口1.2、设定客户连接请求队列的长度1.3、设定绑定的IP地址1.4、默认构造方法的作用2、接收和关闭与客户的连接3、关闭ServerSocket4、获取ServerSocket的信息5、ServerSocket选项5.1、SO_TIMEOUT选项5.2、SO_REUSEADDR选项5.3、SO_RCVBUF选项5.4、设定连接时间、延迟和带宽的相对重要性6、创建多线程服务器6.1、 为每个客户分配一个线程6.2、使用JDK类库提供的线程池概述原创 2020-12-17 23:35:16 · 358 阅读 · 0 评论 -
【Netty】shutdownGracefully初识(二)
Netty 的优雅退出在实际项目中,Netty 作为高性能的异步 NIO 通信框架,往往用作基础通信框架负责各种协议的接入、解析和调度等,例如在 RPC 和分布式服务框架中,往往会使用 Netty 作为内部私有协议的基础通信框架。当应用进程优雅退出时,作为通信框架的 Netty 也需要优雅退出,主要原因如下:尽快的释放 NIO 线程、句柄等资源;如果使用 flush 做批量消息发送,需要...转载 2020-03-03 15:57:30 · 2197 阅读 · 0 评论 -
【Netty 】Netty 知识整理 (1) fireChannelRead用法
目录1. 进程的优雅退出1.1.Kill -9 PID 带来的问题1.2.JAVA 优雅退出2. 如何实现 Netty 的优雅退出2.0.1. 信号简介2.0.2. Java 程序的优雅退出1. 进程的优雅退出1.1.Kill -9 PID 带来的问题在 Linux 上通常会通过kill -9 pid的方式强制将某个进程杀掉,这种方式简单高效,因此很多程序的停止脚本经常会选择使用 kill ...原创 2020-02-29 16:10:42 · 8921 阅读 · 0 评论 -
【Netty】shutdownGracefully初识(一)
写本篇文章的出发点来自之前的一篇文章《future.channel().closeFuture().sync()作用》那篇文章初识了shutdownGracefully()方法,但是没有深入的解释该方法作用,文章中的例子也没有实际执行到该方法,只能从字面理解到优雅的关闭,本篇主要讲解该方法的入门,通过一个测试例子,简单介绍该方法的作用和学习该方法一些技巧。我的思路是启动一个netty serv...原创 2020-02-26 14:12:22 · 6985 阅读 · 3 评论 -
【Netty4】netty ByteBuf (二) 引用计数对象(reference counted objects)
原文出处:http://netty.io/wiki/reference-counted-objects.html自从Netty 4开始,对象的生命周期由它们的引用计数(reference counts)管理,而不是由垃圾收集器(garbage collector)管理了。ByteBuf是最值得注意的,它使用了引用计数来改进分配内存和释放内存的性能。下文中的测试例子主要是断言为主,elcipse...原创 2020-02-24 11:23:03 · 1723 阅读 · 0 评论 -
【Netty4】future.channel().closeFuture().sync()作用& bind(port).sync()作用
我们看个例子:启动一个server,监听8088端口,再通过命令行执行 telnet localhost 8088来连接。完整的例子请参考之前的入门例子介绍:Netty入门官方例子解析(一)丢弃服务器《入门例子,不返回消息》章节public class DiscardServer { try { ...原创 2020-02-19 16:15:19 · 13851 阅读 · 8 评论 -
netty 获取IP
获取IP的方式,主要是找到channel,不同的地方有不同的实现1.handler中获取ippublic class DiscardServerHandler extends ChannelInboundHandlerAdapter {@Override public void channelActive(ChannelHandlerContext ctx) throws Excep...原创 2020-02-13 14:01:09 · 1756 阅读 · 0 评论 -
【Netty4】netty ByteBuf (一)如何创建ByteBuf对象
有一点我们需要知道的是,ByteBuf的jar包,是可以单独使用的。比如某个项目中有一个场景,需要处理某个自定义的协议,那么我们在解析协议时,就可以将接收到的将字节内容写入一个ByteBuf,然后从ByteBuf中慢慢的将内容读取出来。下面让我们用一个例子简单的了解下ByteBuf的使用。ByteBuf的创建要想使用ByteBuf,首先肯定是要创建一个ByteBuf,更确切的说法就是要申请一块...原创 2020-02-11 15:47:31 · 5941 阅读 · 1 评论