![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
netty
文章平均质量分 50
要争气
人生来平凡,因奋斗进取而不凡。
展开
-
ByteBuf的三种缓冲区创建
package com.tech.netty.bytebuf;import io.netty.buffer.ByteBuf;import io.netty.buffer.CompositeByteBuf;import io.netty.buffer.Unpooled;/** * @author lw * @since 2021/9/27 */public class ByteBufTest { public static void main(String[] args) thr.原创 2021-09-27 11:21:05 · 428 阅读 · 0 评论 -
使用Netty提供的解码器解决TCP粘包和拆包问题
解决粘包和拆包问题: 发送端需要使用tcp_nodelay来关闭nagle算法,有数据就发送; 接收端,需要在应用层来解决问题,可用的方式: 固定消息长度,比如不足的位数补0,接收端使用FixedLengthFrameDecoder; 使用换行符、自定义分隔符给消息添加边界; 将消息拆分为消息头和消息体,消息头中指定了消息长度等信息,接收端使用LengthFieldBas...原创 2021-09-24 16:40:36 · 399 阅读 · 0 评论 -
事件在ChannelHandler的传播顺序
pipeline是由ChannelHandlerContext组成的双向链表,事件在入站处理器上是从前往后传播,在出站处理器上是从后往前传播。入站处理器上下文,通过fireXXX方法,将事件从当前处理器传递到下个处理器对应方法;如果是由pipeline或者channel调用fireXXX方法,将事件从队列的首部开始传递。...原创 2021-09-24 09:52:47 · 257 阅读 · 0 评论 -
Netty ChannelOption.SO_BACKLOG配置
ChannelOption.SO_BACKLOG对应的是tcp/ip协议,listen函数中的backlog参数,用来初始化服务端可连接队列。函数:// backlog 指定了内核为此套接口排队的最大连接个数;// 对于给定的监听套接口,内核要维护两个队列: 未连接队列和已连接队列listen(int socketfd,int backlog)backlog 用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的...转载 2021-09-23 13:44:57 · 1523 阅读 · 0 评论 -
TCP三次握手第三次握手时ACK丢失怎么办
当Client端收到Server的SYN+ACK应答后,其状态变为ESTABLISHED,并发送ACK包给Server; 如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。 Server重发SYN+ACK包的次数,可以通过设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5。 如果重发指定转载 2021-09-23 11:00:13 · 569 阅读 · 0 评论 -
TCP 协议(序号和确认号)
接下来的内容是学习后续内容的基础,必须先讲清楚。为了方便你回忆 TCP 首部,这里再次把这个图贴出来,以便对照。图1 TCP 首部1. 序号序号占用 4 字节,即 32 位。它的范围是[0,232−1],也就是说一共有 4 294 967 296 个序号。TCP 协议中的序号,指的是报文段序号。字节序号TCP 连接中,为传送的字节流(数据)中的每一个字节按顺序编号。也就是说,在一次 TCP 连接建立的开始,到 TCP 连接的断开,你要传输的所有数据的每一个字节都要编号。这...转载 2021-09-17 18:03:37 · 11208 阅读 · 1 评论 -
TCP三次握手、四次挥手过程及原理
CP 协议简述TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。同时由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP是全双工模式,所以需要四次挥手关闭连接。TCP包首部网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结转载 2021-09-17 16:47:53 · 432 阅读 · 0 评论 -
使用Netty编写一个Echo程序
Echo服务程序:实现客户端发送消息给服务器,服务器将收到的消息返回给客户端。Echo服务程序可以用于程序调试和检测。package com.tech.netty.echo;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.nio.NioEventLo原创 2021-09-17 12:33:52 · 146 阅读 · 0 评论 -
Linux中select poll和epoll的区别
在Linux Socket服务器短编程时,为了处理大量客户的连接请求,需要使用非阻塞I/O和复用,select、poll和epoll是Linux API提供的I/O复用方式,自从Linux 2.6中加入了epoll之后,在高性能服务器领域得到广泛的应用,现在比较出名的nginx就是使用epoll来实现I/O复用支持高并发,目前在高并发的场景下,nginx越来越收到欢迎。一.select 下面是select的函数接口:C代码intselect(intn,fd_...转载 2021-09-16 10:01:28 · 180 阅读 · 0 评论 -
select、poll和epoll
问题:如果我们先前创建的几个进程承载不了目前快速发展的业务的话,是不是还得增加进程数?我们都知道系统创建进程是需要消耗大量资源的,所以这样就会导致系统资源不足的情况。那么有没有一种方式可以让一个进程同时为多个客户端端提供服务?接下来要讲的IO复用技术就是对于上述问题的最好解答。对于IO复用,我们可以通过一个例子来很好的理解它。(例子来自于《TCP/IP网络编程》)某教室有10名学生和1名老师,这些学生上课会不停的提问,所以一个老师处理不了这么多的问题。那么学校为每个学生都配一名老师,也就转载 2021-09-15 17:23:41 · 221 阅读 · 0 评论 -
select、poll和epoll之间的区别
在深入理解select、poll和epoll之间的区别之前,首先要了解什么是IO多路复用模型。IO多路复用简单来说,IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备就绪,它就通知该进程去进行IO操作。详细的描述可以参考IO模型。select、poll和epoll都是提供I/O多路复用的解决方案。select函数int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *ex转载 2021-09-15 16:16:43 · 112 阅读 · 0 评论 -
Linux IO基础原理及五种IO模型
一 Linux IO基础原理 应用程序的IO读写,依赖于底层操作系统的IO读写,它是通过操作系统的两大系统调用Read/Write实现的。在Linux操作系统中设置了唯一的一个内核缓冲区,并未每个上层应用程序设置看一个用户缓冲区,当应用程序进行数据读取时,内核将数据从内核缓冲区复制到用户缓冲区,当应用程序进行数据写入时,内核将数据从用户缓冲区复制到内核缓冲区,设置缓冲区的目的是减少性能消耗,因为直接对外部设备进行IO读写会造成操作系统中断,操作系统频繁访问外部设备会,会造成不必要的性能开...原创 2021-09-15 10:17:43 · 610 阅读 · 0 评论 -
Linux 五种IO模型详细图解
一、IO 简述IO (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作,通常用户进程中的一个完整IO分为两阶段:用户进程空间<–>内核空间、内核空间<–>设备空间(磁盘、网络等)。IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者。LINUX中进程无法直接操作I/O设备,其必须通过系统调用请求kernel来协助完成I/O动作;内核会为每个I/O设备维护一个缓冲区。对于一个输入(读取到内存)操作来说,进程IO系统调用后,转载 2021-09-14 10:02:18 · 415 阅读 · 0 评论 -
详解IO模型
一、IO基础原理1、操作系统的IO应用程序进行IO的读写,依赖于底层操作系统的IO读写,是通过操作系统的两大系统调用read、write来实现的。应用程序调用操作系统的read、write接口,完成数据在应用程序的进程缓冲区和操作系统的内核缓冲区之间的交互。 操作系统设置数据缓冲区的目的,是为了提升性能。外部设备的直接读写,涉及操作系统的中断。发生系统中断时,需要保存之前的进程数据和状态等信息,而结束中断之后,还需要恢复之前的进程数据和状态等信息。操作系统如果频繁...转载 2021-09-13 15:36:50 · 1170 阅读 · 0 评论 -
BIO编程及其特点分析
服务端:监听端口,监听客户端发送的消息,返回服务器时间给客户端。package com.tech.netty.bio;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * @author lw * @since 2021/9/13 */public class BioServer { private static final int PORT = 808原创 2021-09-13 13:56:01 · 121 阅读 · 0 评论 -
基于Netty实现简单的RPC框架
Dubbo采用Netty作为基础通信组件,模仿Dubbo实现简单版的RPC框架。服务消费者和服务提供者约定接口和协议,用于远程调用和TCP请求验证。服务提供者作为NettyServer端,需要对接口进行实现,对于满足约定协议的TCP请求进行处理,调用约定接口中的相应方法进行响应。服务消费者作为NettyClient端,需要给公共接口创建代理对象,调用接口方法时,在代理对象中来发起TCP请求,等待服务端的响应返回结果,从而实现RPC调用。总体设计:关键代码:pub...原创 2021-09-09 15:04:17 · 142 阅读 · 0 评论 -
你真的了解Netty中@Sharable?
一、前言Netty 是一个可以快速开发网络应用程序的基于事件驱动的异步 网络通讯 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的应用还是比较广泛的,比如阿里巴巴开源的 Dubbo 和 Sofa-Bolt等 框架底层网络通讯都是基于 Netty 来实现的。Netty的设计是精妙的,其中每个设计点都值得我们去深思,本节我们来看看Netty中@Sharable的设计哲学二、Netty基础快速回顾如果你熟悉netty请直接看第三节io.netty.channel.Chan转载 2021-09-08 15:42:51 · 241 阅读 · 0 评论 -
netty handler的线程安全性与@Sharable
1. Bootstrap中直接添加sb.childHandler(new MySimpleChannelInboundHandler())这个childHandler都是同一个实例,也就说会导致不同的channel用了同一个handler2.netty的一大好处就是每一个channel都有自己绑定的eventloop和channelHandler,这样可以保证代码串行执行,不必考虑并发同步的问题。3.只要写个类继承ChannelInitializer就行了,ChannelInit...转载 2021-09-08 15:37:49 · 1935 阅读 · 0 评论 -
Netty 使用异步线程池执行耗时任务
一 任务队列 这种方式运行任务队列线程和事件循环线程是同一个线程,并没有使用新的线程。 Netty的事件循环EventLoop是一个不断循环着执行读取就绪事件、处理事件、运行任务队列这三个操作的一个线程。事件循环关联了一个任务队列,用于存放耗时较长的业务处理操作。事件循环线程先读取就绪事件,如果任务队列为空则用阻塞一定时间的方式读取,如果任务队列非空,则使用非阻塞的方式读取,读取就绪事件。读取后进行处理事件,记录处理事件花费的时间,在任务队列中不断取出任务执行,默认花费在任...原创 2021-09-07 11:04:54 · 2170 阅读 · 0 评论 -
Netty源码分析:NioEventLoop启动以及其IO操作和Task任务的处理
在上篇博文分析服务端启动的过程中,我们遇到了如下的代码片段, if (eventLoop.inEventLoop()) { register0(promise); } else { try { eventLoop.execute(new OneTimeTask() { @Override ...转载 2021-09-07 10:37:31 · 669 阅读 · 0 评论 -
ChannelPipeline 调用 handler 的过程分析
pileline channelhandlercontext handler关系每一个通道Socket都关联了一个Pipeline,用于业务处理,管道是由ChannelHandlerContext组成的双向,每个ChannelHandlerContext包装了一个Handler进行业务处理,它采用了责任链设计模式,对拦截的事件和数据在管道中相应的handler进行传播。根据数据的传播方向分为两种操作:入站操作:数据从Socket流向Pipeline; 出站操作:数据从Pipeline流向So.原创 2021-09-03 15:44:46 · 236 阅读 · 0 评论 -
TCP 拆包和粘包问题及解决方案
TCP是面向流的,TCP消息没有边界,TCP根据缓冲区的实际情况,可能会将一个大的数据包拆分成多个小的数据包进行发送,也可能会将多个小的数据包封装成一个大的数据包进行发送,这就是拆包和粘包。 粘包产生的原因:(1)待发送数据的长度小于待发送缓冲区的大小,多个数据可能会被一次发送;(2)消息接收端没有及时读取接收缓冲区中的数据; 拆包产生的原因:(1)待发送数据的长度大于待发送缓冲区剩余空间的大小;...原创 2021-09-01 10:49:53 · 184 阅读 · 0 评论 -
TCP粘包和拆包
TCP粘包和拆包 TCP是个“流”协议,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况。(1)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;(...原创 2021-08-31 14:05:39 · 61 阅读 · 0 评论 -
其他解码器
ReplayingDecoder 是ByteToMessageDecoder类型,不需要判断可读字节数直接进行读取之前用的解码器:package com.tech.netty.netty.inboundleandoutboudle;import io.netty.buffer.ByteBuf;import io.netty.channel.ChannelHandlerContext;import io.netty.handler.codec.ByteToMessageDecoder;..原创 2021-08-30 15:46:11 · 107 阅读 · 0 评论 -
Netty出入站机制与编解码器
从Socket读取数据到客户端/服务器为入站操作,入站操作管道中事件传播顺序是从前往后;将客户端/服务器数据写入到Socket为出站操作,出站操作管道中事件传播顺序是从后往前。编码器为出站处理器,将业务数据进行编码,使用编码器收到的数据类型必须与处理的类型一致,否则encode方法不会被调用;解码器为入站处理器,对编码后的数据进行解码为我们的业务数据,解码器需要判断ByteBuf中可读取的字节数是否足够。出入站操作:接下来实现通过自定义编码器解码器实现字节码和Long类型的转换...原创 2021-08-27 18:21:32 · 252 阅读 · 0 评论 -
Netty接口ChannelHandlerContext
在ChannelHandler 添加到 ChannelPipeline 时会创建一个实例,就是接口 ChannelHandlerContext,它代表了 ChannelHandler 和ChannelPipeline 之间的关联。接口ChannelHandlerContext 主要是对通过同一个 ChannelPipeline 关联的 ChannelHandler 之间的交互进行管理ChannelHandlerContext 中包含了有许多方法,其中一些方法也出现在 Channel 和ChannelPi转载 2021-08-25 11:13:47 · 690 阅读 · 0 评论 -
Netty 出站入站机制详解
前段时间在B站学习Netty,讲到出站入站的机制时一直没搞明白到底是怎么弄的,直到开始讲源码部分时才终于搞明白。先来看看Netty官方有关出站入站机制的解释:按照图片的理解,则是在通道中,每次出现读事件时,会从头至尾依次调用Inbound即入站方法处理;而触发写事件时,则会从尾到头依次调用outbound即出站方法处理。这里会给人一种错觉,那就是netty在内部维护了两个单向链表实现出站入站操作,而事实上,ChannelPipeline中实际上是维护了一条由ChannelHandlerCo转载 2021-08-25 11:01:40 · 1293 阅读 · 0 评论 -
ProtoBuf 编解码
在网络程序开发过程中,数据在网络中是以二进制字节码的格式传输的,在发送业务数据前,先对业务数据进行编码,经过网络传输,收到数据后对数据进行解码,Netty提供了一些编解码器,它们底层采用了java序列号技术,有一定的弊端:首先不支持跨语言;序列化体积较大;序列化性能不高。针对这些问题,可以采用ProtoBuf来解决:ProtoBuf是一种支持跨语言传输、高性能、高可靠的数据存储格式,支持序列化,适合用作RPC远程调用的数据交换格式。ProtoBuf的使用是先编写.proto文件来描述消息,然后使用proto原创 2021-08-23 17:32:18 · 1633 阅读 · 0 评论 -
Netty实现WebSocket长连接
WebSocket协议是使用单个TCP连接进行全双工通信的协议,浏览器与服务器使用一个长连接,可以双向数据传输,且服务器可以主动给浏览器推送数据。Netty是通过给通道绑定的管道,添加一个WebSocketServerProtocleHandler处理器,将http协议升级为WebSocket协议的,数据传输采用帧WebSocketFrame的形式,比如常用的文本帧TextWebSocketFrame传输文本数据。服务器package com.tech.netty.netty.w...原创 2021-08-20 16:54:44 · 1289 阅读 · 0 评论 -
Netty心跳检测机制
Netty提供了心跳检测机制,它的使用是在通道绑定的管道上添加空闲事件处理器,它可以检测在相应的时间里是否进行过数据读取、数据写入或者数据读写,如果没有发生过则产生读空闲事件、写空闲事件或者读写空闲事件,这些事件会传递给管道的下一个处理器,下一个处理器使用用户事件触发器方法对空闲事件进行处理,比如关闭通道。package com.tech.netty.netty.heartbeat;import io.netty.bootstrap.ServerBootstrap;import ...原创 2021-08-20 11:11:00 · 224 阅读 · 0 评论 -
基于Netty的简单群聊系统
客户端上下线信息被服务器端转发给其他客户端;客户端发送的信息被服务器端转发给其他客户端;服务端:package com.tech.netty.netty.groupchat;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOpt原创 2021-08-19 18:01:32 · 110 阅读 · 0 评论 -
SimpleChannelInboundHandler 中常用的事件方法
从建立连接到断开连接,会触发各种事件,每个事件的触发都会关联处理器中的某个方法被调用。从建立连接到断开连接会依次执行下列方法:事件 方法 新的客户端连接事件 handlerAdded 通道注册事件 channelRegistered 通道处于活动状态事件 channelActive 通道数据可读取事件 channel..原创 2021-08-19 15:11:01 · 1891 阅读 · 0 评论 -
Unpooled和ByteBuf
ByteBuf是Netty的数据容器对象;Unpooled是操作数据容器的工具类;package com.tech.netty.buf;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;/** * @author lw * @since 2021/8/18 */public class NettyByteBuf { public static void main(String[] args) {原创 2021-08-18 16:34:13 · 775 阅读 · 0 评论 -
Netty中的Option和ChildOption参数解析
前言Netty中的Option和ChildOption的区别:1.Netty中的option主要是设置的ServerChannel的一些选项,而childOption主要是设置的ServerChannel的子Channel的选项。2.如果是在客户端,因为是Bootstrap,只会有option而没有childOption,所以设置的是客户端Channel的选项。本文转载自:Netty:option和childOption参数设置说明一.通用参数CONNECT_TIMEOUT_MILLIS转载 2021-08-18 11:29:38 · 776 阅读 · 0 评论 -
Netty实现简易版Http服务
浏览器访问服务端监听的端口,服务端做出应答package com.tech.netty.http;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;/** * @autho原创 2021-08-17 15:26:16 · 127 阅读 · 0 评论 -
Netty非阻塞模型
Netty的很多操作是非阻塞的,像bind、connect、write等,这些操作调用后紧接着返回一个ChannelFuture,它是一个异步执行结果,通过ChannelFuture可以获取执行状态及添加监听器,当执行完成会通知监听器。package com.tech.netty.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.chann原创 2021-08-13 15:34:24 · 369 阅读 · 0 评论 -
通过任务队列实现 推送消息 功能
在服务器端每次初始化通道时,把新通道添加到一个集合中; 在处理器中,获取当前所有客户端对应的通道,根据通道获取通道所属的事件循环,往事件循环的任务队列提交发送消息的任务; 循环事件的任务会被执行,通过任务将消息发送到对应通道;服务端:package com.tech.netty.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.c原创 2021-08-13 14:11:46 · 312 阅读 · 0 评论 -
提交任务到任务队列
在服务端处理器中,对于比较耗时的任务,可以提交任务到任务队列进行异步执行; 任务队列有两种任务队列,和定时任务队列,定时任务队列在放入任务开始计时,到时在队列取出执行; 提交任务队列需要先获取通道,根据通道获取EventLoop,根据事件循环的方法提交任务到任务队列;服务端:package com.tech.netty.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture原创 2021-08-13 11:27:54 · 376 阅读 · 0 评论 -
Netty入门实例 TCP服务
基于Netty开发一个入门程序,主要功能:服务端启动后监听一个端口,客户端启动后会给服务端发送一条消息,服务端收到后通过Handler读取消息,进行处理,读取完通过Handler反馈一条消息给客户端。服务端:Serverpackage com.tech.netty.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.原创 2021-08-11 17:10:01 · 249 阅读 · 0 评论 -
零拷贝 示例程序
示例程序实现 客户端程序将本地文件经网络IO发送至服务端。客户端程序package com.tech.netty.zerocopy;import java.io.FileInputStream;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.nio.channe原创 2021-08-05 10:57:00 · 128 阅读 · 0 评论