
Netty
文章平均质量分 76
Netty
ximeneschen
这个作者很懒,什么都没留下…
展开
-
Netty之ChannelOption
在用netty作为底层网络通信的时候关于ChannelOption的参数让我一直模糊不清楚,于是去看一下linux网络编程,发现ChannelOption的各种属性在套接字选项中都有对应。下面简单的总结一下ChannelOption的含义已及使用的场景ChannelOption.SO_BACKLOGChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数,函数listen(int socketfd,int backlog)用来初始化服务端可连接原创 2022-04-21 01:27:48 · 504 阅读 · 1 评论 -
LVS原理图解
一、LVS是什么LVS(Linux Virtual Server),是一个极好的负载均衡解决方案,它将一个真实服务器集群虚拟成一台服务器来对外提供服务,同时在真实服务器集群中实现了负载均衡。该技术由章文嵩博客发起,从linux2.4开始已经被收录到linux核心中。二、LVS有什么用随着互联网在人们生活中的普及,企业级应用迎来了海量数据的冲击,如微信、美团外卖、微信支付等应用每天的使用人数都在千万以上,仅靠单台机器提供服务已经行不通了。我们可以使用多台服务器分摊这些压力,当一定数量的服务器作为一个原创 2021-09-29 13:09:27 · 1405 阅读 · 0 评论 -
Netty Reactor模型
无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件。一、Reactor三种线程模型单线程模型Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下:1)作为NIO服务端,接收客户端的TCP连接;2)作为NIO客户端,向服务端发起TCP连接;3)读取通信对端的请求或者应答消息;4)向通信对端发送消息请求或者应答消息。Reactor单线程模型示意原创 2021-09-29 00:32:42 · 632 阅读 · 0 评论 -
Bootstrap的handler和childHandler
我们知道不管是服务端还是客户端都进行了handler的设置,通过添加hanlder,我们可以监听Channel的各种动作以及状态的改变,包括连接,绑定,接收消息等。在基类AbstractBootstrap有handler方法,目的是添加一个handler,监听Bootstrap的动作,客户端的Bootstrap中,继承了这一点。在服务端的ServerBootstrap中增加了一个方法childHandler,它的目的是添加handler,用来监听已经连接的客户端的Channel的动作和状态。han原创 2021-09-28 16:17:25 · 1205 阅读 · 0 评论 -
future.channel().closeFuture().sync()作用& bind(port).sync()作用
一、 实例例子1public class NettyServer { public static void main(String[] args) throws InterruptedException { EventLoopGroup parentGroup = new NioEventLoopGroup(); EventLoopGroup childGroup = new NioEventLoopGroup(); try {原创 2021-09-28 15:36:42 · 1362 阅读 · 0 评论 -
源码解析 Netty Channel接口及其实现类
https://www.cnblogs.com/jtlgb/p/10494731.html原创 2021-09-28 11:12:55 · 189 阅读 · 0 评论 -
IM即时通讯实现原理
即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议。前者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。而后者是以数 据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。QQ就是使用UDP协议进行发送和接收消息的。当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又是客户端(Cl转载 2021-09-27 12:41:58 · 3498 阅读 · 0 评论 -
Netty @Sharable的使用
一、@Sharable的真实含义当netty尝试往多个channel的pipeline中添加同一个ChannelHandlerAdapter实例时,会判断该实例类是否添加了@Sharable,没有则抛出… is not a @Sharable handler, so can’t be added or removed multiple times异常如果你添加的不是单例Handler,你加不加@Sharable没有任何区别如果你添加的是单例Handler,只要它会被添加到多个channe原创 2021-09-26 11:07:41 · 2348 阅读 · 0 评论 -
Netty自定义协议
一、自定义协议要素魔数,用来在第一时间判定是否是无效数据包,如java的coffee baby版本号,可以支持协议的升级序列化算法,消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian、jdk指令类型,是登录、注册、单聊、群聊… 跟业务相关请求序号,为了双工通信,提供异步能力正文长度消息正文:如json,xml...原创 2021-09-26 10:35:06 · 1409 阅读 · 1 评论 -
Netty内置处理器以及编解码器
一、Netty已经为我们提供了常用协议的处理器,我们直接使用就可以可以看到包括redis协议,http协议等主流协议的编码解码器,netty都为我们提供了。二、代码测试使用netty直接对redis进行操作redis协议的详细规定,这里不深入@Slf4jpublic class SimpleRedisProtocol { public static void main(String[] args) { final byte[] LINE = {13, 10};原创 2021-09-25 00:30:09 · 325 阅读 · 0 评论 -
三、Netty的粘包半包问题解决
一、定义TCP 传输中,客户端发送数据,实际是把数据写入到了 TCP 的缓存中,粘包和半包也就会在此时产生。客户端给服务端发送了两条消息ABC和DEF,服务端这边的接收会有多少种情况呢?有可能是一次性收到了所有的消息ABCDEF,有可能是收到了三条消息AB、CD、EF。粘包上面所说的一次性收到了所有的消息ABCDEF,类似于粘包。如果客户端发送的包的大小比 TCP 的缓存容量小,并且 TCP 缓存可以存放多个包,那么客户端和服务端的一次通信就可能传递了多个包,这时候服务端从 TCP 缓存就可能一下原创 2021-09-24 13:17:26 · 1195 阅读 · 0 评论 -
消息边界处理
一、消息边界问题接收如下:可以看到,由于系统默认编码是utf-8,每个中文会被编码为3个字节,然后我们由于这一行: ByteBuffer buffer = ByteBuffer.allocate(4);导致一次只能读取4个字节,那么就会触发两次读取,第一次读到中和1/3国,第二次读到2/3国。最终造成国乱码。根源就是消息边界问题。二、消息边界情况三、解决方法一种思路是固定消息长度,数据包大小一样,服务器按预定长度读取,缺点是浪费带宽另一种思路是按分隔符拆分,缺点是效率低TLV原创 2021-09-22 12:52:02 · 405 阅读 · 0 评论 -
完全理解NIO Selector
一、Selector是什么Selector是一个或多个SelectableChannel对象的多路复用器.如何创建一个Selector对象一个selector对象可以通过调用Selector.open()来创建,这个工厂方法会使用系统默认的selector provider来创建一个新的selector对象。或者我们还可以通过实现抽象类SelectorProvider自定义一个selector provider,然后调用它的openSelector()来创建,例如:new SelectorProvi转载 2021-09-22 10:09:02 · 471 阅读 · 0 评论 -
原生JAVA的TCP/UDP编程
一、TCP/UDP对比二、TCP编程TCP字节流编程- Server端:public class TCPServerStream { public static void main(String[] args) { /* * 1.在本机的 9999 端口监听,等待连接 * 2.当没有客户端链接9999端口时,程序会阻塞,等待链接 * 3.通过socket.getInputStream()读取客户端写入到数据通道的数据原创 2021-09-09 14:52:41 · 256 阅读 · 0 评论 -
Java输出流需要注意的几点细节
一、OutputStream—字节输出流FileOutputStream—字节文件输出流,write数据后立刻写到文件中去BufferedOutputStream—带缓冲区的字节输出流,数据会先存放到缓存取,缓冲区满的话会自动flush到目的地。 也就是说这个类写数据必须要调用flush方法,否则数据无法写到目的地,当然也可以调用close方法,这个方法关闭流的时候会自动flush二、Writer----字符输出流FileWriter—字符文件输出流,write后,会将字符转换成字节缓存到底层原创 2021-09-09 14:13:34 · 717 阅读 · 0 评论 -
Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)
为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));中的dout做为Socket输出流的代言。同样的,din是输入流的代言。可以造成dout被关闭的操作有:调用dout.close();或din.close();因为使用这种流关闭,会造成socket被关闭,所以输入输出流都将不可再用。调用socket.close();调用so原创 2021-09-09 13:53:34 · 432 阅读 · 0 评论 -
try-with-resources引起的Socket关闭,产生java.net.SocketException: Socket is closed?
一、try-with-resources是什么?它是jdk1.7之后出现的一直新的try-catch异常捕获操作,目的就是简化操作,实现资源的自动关流。示例代码 try(FileReader fr = new FileReader("E:\\c.txt")){ int c = fr.read(); System.out.println((char)c); }catch (IOException e){ e.pri转载 2021-09-08 22:24:15 · 934 阅读 · 0 评论 -
五、Netty核心组件
为了后期更好地理解和进一步深入 Netty,有必要总体认识一下 Netty 所用到的核心组件以及他们在整个 Netty 架构中是如何协调工作的。一、Netty 有如下几个核心组件Bootstrap & ServerBootstrap:客户端和服务端的引导类Channel:代表了一个链接,与EventLoop一起用来参与IO处理。ChannelFuture:Netty 为异步非阻塞,即所有的 I/O 操作都为异步的,因此,我们不能立刻得知消息是否已经被处理了。Netty 提供了 Chann原创 2021-05-25 10:47:20 · 262 阅读 · 0 评论 -
四、Netty 实现心跳机制与断线重连
一、概述何为心跳顾名思义, 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性.为什么需要心跳因为网络的不可靠性, 有可能在 TCP 保持长连接的过程中, 由于某些突发情况, 例如网线被拔出, 突然掉电等, 会造成服务器和客户端的连接中断. 在这些突发情况下, 如果恰好服务器和客户端之间没有交互的话, 那么它们是不能在短时间内发现对方已经掉线的. 为了解决这个问题, 我们就需要引入心跳机制. 心跳机制的工作转载 2021-05-24 17:05:20 · 763 阅读 · 0 评论 -
二、Netty服务端/客户端启动整体流程
一、综述Netty 的整体流程相对来说还是比较复杂的,初学者往往会被绕晕。所以这里总结了一下整体的流程,从而对 Netty 的整体服务流程有一个大致的了解。从功能上,流程可以分为服务启动、建立连接、读取数据、业务处理、发送数据、关闭连接以及关闭服务。整体流程如下所示(图中没有包含关闭的部分):二、启动流程概述Netty服务端的启动流程如下:启动流程大致分为五步创建ServerBootstrap实例,ServerBootstrap是Netty服务端的启动辅助类,其存在意义在于其整合了Nett原创 2021-05-12 22:48:54 · 1826 阅读 · 0 评论 -
一、把握 Netty 整体架构脉络
一、整体结构Netty 是一个设计非常用心的网络基础组件,结构一共分为三个模块:Core 核心层提供了底层网络通信的通用抽象和实现,包括可扩展的事件模型、通用的通信 API、支持零拷贝的 ByteBuf 等。Protocol Support 协议支持层覆盖了主流协议的编解码实现,如HTTP、SSL、Protobuf、压缩、大文件传输、WebSocket、文本、二进制等主流协议,此外 Netty 还支持自定义应用层协议。Transport Service 传输服务层提供了网络传输能力的定义和原创 2021-05-13 17:35:55 · 245 阅读 · 0 评论 -
Netty出现的原因以及多种Reactor模式
一、原生NIO存在的问题NIO的类库与API繁杂,需要熟练掌握Selector、ServerSocketChannel、SocketChannel、Bytebuffer等要求熟悉Java多线程编程和网络编程开发工作量和难度大,例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等。JDK NIO的BUG:例如Epoll Bug,它会导致Selector空轮询,最终导致CPU占用100%,到JDK1.7还未被有效解决二、Netty说明Netty是由JBOSS提供的一个Java开源转载 2021-05-12 11:33:27 · 249 阅读 · 0 评论 -
Netty的引用计数对象
从Netty 4起,对象的生命周期由它们的引用计数来管理,因此,一旦对象不再被引用后,Netty 会将它(或它共享的资源)归还到对象池(或对象分配器)。在垃圾回收和引用队列不能保证这么有效、实时的不可达性检测的情况下,引用计数以牺牲轻微的便利性为代价,提供了另一种可选的解决方案。 最值得注意的类型是ByteBuf,它正是利用了引用计数来提升内存分配和释放的性能。一、引用计数基本原理一个新创建的引用计数对象的初始引用计数是1。ByteBuf buf = ctx.alloc().directbuffer(转载 2021-05-25 08:58:02 · 339 阅读 · 0 评论 -
NIO-零拷贝
一、前言磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。这次,我们就以「文件传输」作为切入点,来分析 I/O 工作方式,以及如何优化传输文件的性能。二、为什么要有 DMA 技术?在没有 DMA 技术前,I/O 的过程是这样的:CPU 发出对应的指令给磁盘控制器,然后返回;磁盘控制器收到指令转载 2021-05-12 10:03:48 · 904 阅读 · 0 评论 -
高并发核心Selector详解
Selector设计笔者下载得是openjdk8的源码, 画出类图比较清晰得看到,openjdk中Selector的实现是SelectorImpl,然后SelectorImpl又将职责委托给了具体的平台,比如图中框出的linux2.6以后才有的EpollSelectorImplWindows平台是WindowsSelectorImplMacOSX平台是KQueueSelectorImpl从名字也可以猜到,openjdk肯定在底层还是用epoll,kqueue,iocp这些技术来实现.原创 2021-05-11 23:42:23 · 502 阅读 · 3 评论 -
NIO核心之Channel,Buffer和Selector简介
在NIO的API中,Channel就是实现非阻塞的组件,而事件分发(Dispatcher)使用的是Selector组件,在传统的I/O流(Stream)是有方向的,而NIO支持双向读写,这样就需要将流中的数据读取到某个缓冲组件里,即Buffer组件.Buffer组件还有个特殊的实现DirectByteBuffer, 可以申请堆外内存,关于为什么要申请堆外内存后续会谈。ChannelChannel是NIO中用来实现非阻塞数据操作的桥梁,笔者猜测是借鉴的Berkly Socket的设计,代表某种通道,和原创 2021-05-11 23:01:37 · 496 阅读 · 0 评论 -
BIO-NIO-AIO
一、同步和异步同步和异步是针对应用程序和操作系统的内核交互而言的,同步指的是用户进程触发IO操作并等待或者轮询地区查看IO操作是否就绪,而异步是值用户触发IO操作以后便开始做自己地事情,而当IO操作已经完成地时候会得到IO完成地通知。以银行取款为例:同步:自己亲自持银行卡到银行取钱(使用同步IO时,JAVA自己处理IO读写)异步:委托小弟到银行取钱,我干其他事,然后给我(使用异步IO时,J...原创 2020-04-22 20:00:05 · 295 阅读 · 0 评论 -
Java I/O模型从BIO到NIO和Reactor模式
本文转发自技术世界,原文链接 http://www.jasongj.com/java/nio_reactor/Java I/O模型同步 vs. 异步同步I/O 每个请求必须逐个地被处理,一个请求的处理会导致整个流程的暂时等待,这些事件无法并发地执行。用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行。异步I/O 多个请求可以并发地执行,一个请求或者任务的执行不会导致整个流程的暂时等待。用户线程发起I/O请求后仍然继续执行,当内核I/O操作完成后会通知用户线程,或者调用用户线程注转载 2020-05-24 18:22:00 · 175 阅读 · 0 评论