自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 Netty 学习笔记 目录

这是学习Netty时的笔记视频地址:https://www.bilibili.com/video/BV1DJ411m7NR源码地址:https://github.com/TOM50HZ/netty-study.git1 IO模型1.1 BIO简介1.2 NIO简介1.2.1 Buffer 机制1.2.2 Channel 通道与 Selector选择器1.2.3 零拷贝1.2.4 NIO入门示例1.2.5 NIO入门实战群聊系统2 Netty2.1 Netty产生原因2.2 线程模

2021-01-31 16:31:41 118 2

原创 Netty 粘包与拆包

2.13 粘包与拆包2.13.1 原理基本介绍TCP是面向连接,面向流的。发送端将数据合成一个大的数据块然后封包发出去。但是接收端就难于分辨出完整的数据包了。因为面向流的通信是无消息保护边界的。粘包拆包图解[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ms81FwX4-1611394301836)(F:\FTHZ\临时截图\Netty\QQ截图20210122103756.png)]客户端发送D1 D2,客户端有4中情况分两次读到了D1和D2 没有粘包拆包服

2021-01-24 14:52:19 105 1

原创 Netty 入站与出站机制

2.12 Netty入站与出站机制2.12.1 说明入站:Socket -> channel出站:Channel -> Socket入站消息会被解码成另一种格式(e.g. Java对象),出站消息会被编码成字节入站例子:解码器-ByteToMessageDecoder:这个类对入站数据进行缓冲,直到数据准备好被处理[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nRS1FDXP-1611394272649)(F:\FTHZ\临时截图\Ne

2021-01-24 14:50:06 553

原创 Netty 编码解码器

2.11 编码解码器2.11.1 概述网络中传输的都是二进制字节码的数据,因此需要编码/解码Netty提供的编码器StringEncoder:对字符串数据进行编码ObjectEncoder:对Java对象进行编码Netty提供的解码器StringDecoder:对字符串数据进行解码ObjectDecoder:对Java对象进行解码问题Netty自带的Object编解码器性能低/无法跨平台/体积大2.11.2 ProtoBuf 概述这是一种轻便高效的结构化

2021-01-24 14:44:15 143

原创 Netty WebSocket长连接开发

2.10 WebSocket长连接开发2.10.1 服务器端HttpServerCodec: Http编解码器ChunkedWriteHandler:块写入写出HttpObjectAggregator:聚合多个HttpWebSocketServerProtocolHandler("/hello"):升级为长连接,匹配的路径EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new

2021-01-24 14:35:00 199

原创 Netty 心跳机制

2.9 心跳机制2.9.1 服务器端在管道中加入IdleStateHandler(long readerIdleTime, long writerIdleTime, long allIdleTime, TimeUnit unit)来间隔空闲状态分别表示 读取空闲 写入空闲 没读也没写 时间单位, 超过时间会发送心跳包一旦触发,会调用下一个handler的userEventTriggered来处理IdleStateEvent事件public class MyServer { pub

2021-01-24 14:30:56 153

原创 Netty实战 群聊系统

2.8 Netty实战 群聊系统2.8.1 服务器端2.8.1.1 服务器端启动public class GroupChatServer { private int port; public GroupChatServer(int port){ this.port = port; } public void run() throws Exception{ EventLoopGroup bossGroup = new NioEven

2021-01-24 14:27:16 103

原创 Netty Unpooled 类

2.7 Unpooled 类一个操作缓冲区的工具类举例一:相较于NIO的buffer,它不需要flip,因为它同时维护readerIndex与writerIndex,把Buffer分成三个区域0 ~ readerIndex: 已经读取区域readerIndex ~ writerIndex: 可读区域writerIndex~capacity: 可写区域ByteBuf buffer = Unpooled.buffer(10); for (int i = 0; i <

2021-01-24 14:25:27 185

原创 Netty 核心模块概述

2.6 Netty核心模块概述2.6.1 Bootstrap / ServerBootstrapBootstrap意为引导,主要作用是配置整个Netty程序。常用方法public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) : 用于服务端设置两个EventLooppublic ServerBootstrap group(EventLoopGroup group) : 客户端设置一

2021-01-24 14:24:20 131

原创 Netty 异步模型 与 HTTP服务程序示例

2.5 异步模型2.5.1 异步模型说明Netty的I/O操作都是异步模型调用者不能立刻获取结果,而是通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制来获得IO操作结果Netty的异步模型是建立在future和callback上的**核心思想:**假设一个方法fun,计算过程可能非常耗时,等待fun返回显然不合适。所以可以在调用fun时,立马返回一个Future,后续可以通过Future去监控fun的处理过长2.5.2 Future说明表示异

2021-01-24 14:20:20 113

原创 Netty TaskQueue 自定义任务

2.4 TaskQueue 自定义任务使用场景用户自定义普通任务任务将会被加到taskQueue中ctx.channel().eventLoop().execute(new Runnable() { @Override public void run() { try { Thread.sleep(10 * 1000); ctx.writeAndFlush(Unpooled.copiedBuffer("Hello,客户

2021-01-23 17:16:59 315

原创 Netty 快速入门

2.3 Netty快速入门2.3.1 服务器端创建了bossGroup 和 workerGroup观察bootstrap.group(bossGroup, workerGroup)方法可以看出bossGroup 是 parentGroup ,workerGroup 是 childGroup给workerGroup初始化通道,然后向管道里面扔一个Handler//创建BossGroup 和 WorkerGroup,都是无限循环//子线程NioEventLoop的默认个数是CPU

2021-01-23 17:16:26 89

原创 线程模型介绍

2.2 线程模型传统阻塞I/OReactor模型单Reactor单线程单Reactor多线程主从Reactor多线程(Netty以此为改进)说明:黄色 – 对象蓝色 – 线程白色 – API2.2.1 传统阻塞I/O模型特点阻塞IO获取数据每个连接都需要独立线程来完成数据输入/业务处理/数据返回问题并发数大,系统会炸没有数据时阻塞在read,造成资源浪费2.2.2 Reactor 模式介绍针对传统阻塞IO的两个问题进行优化基于I/O复用:多连

2021-01-23 17:09:31 133

原创 Netty - 产生原因

2 Netty2.1 概述2.1.1 原生NIO存在的问题API繁杂需要有Java多线程和网络编程技能开发工作量和难度大NIO的空轮询Bug会导致CPU 100%于是Netty出现了2.1.2 Netty简介一个基于事件驱动的网络应用框架,可快速开发高性能的服务器/客户端ElasticSearch和Dubbo内部采用了Netty组件概览[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbXPeTw9-1611392182825)(F:\FTHZ\临时

2021-01-23 17:07:26 89

原创 NIO - 入门实战群聊系统

1.2.5 实战 群聊系统1.2.5.1 客户端属性和构造函数包含一个选择器和一个ServerSocketChannelprivate Selector selector;private ServerSocketChannel listenChannel;private static final int PORT = 6667;public GroupChatServer() { try{ selector = Selector.open();

2021-01-23 17:03:28 113 1

原创 NIO - 入门实例

1.2.4 入门示例1.2.4.1 服务端流程:创建ServerSocketChannel/非阻塞 /绑定端口ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.configureBlocking(false);//设置为非阻塞serverSocketChannel.socket().bind(new InetSocketAddress(6666));//绑定6666

2021-01-23 17:03:00 81

原创 NIO - Channel通道 与 Selector选择器

1.2.2 Channel 通道特点:可以同时读写可以异步读写可以从缓冲区读写数据常用ChannelFileChannel – 文件读写DatagramChannel – UDP读写ServerSocketChannel – TCP读写SocketChannel – TCP读写流程​ 当客户端连接服务器时,服务器上的ServerSocketChannel会创建一个与客户端相对应的SocketChannel1.2.2.1 FileChannel读写操作都是通道视角wri

2021-01-23 16:51:59 344 1

原创 NIO - Buffer机制

1.2.1 Buffer机制缓冲区是一个可读写的内存块(一个含数组的容器对象)Channel提供从文件、网络读取数据的渠道,但是读取或者写入数据都必须经由Buffer1.2.1.1 示例//可存放5个int的BufferIntBuffer intBuffer = IntBuffer.allocate(5);//写操作for(int i = 0 ; i < intBuffer.capacity(); i++){ intBuffer.put(i * 2);}//读写切换in

2021-01-23 16:51:22 115

原创 IO模型 - NIO简介

1.2 Java NIO一个线程多个请求发送的请求会注册到多路复用器上,然后复用器轮询一个线程会维护一个Selector,然后Selector中来轮询三大核心部分:Channel(通道),Buffer(缓冲区),Selector(选择器)选择器根据通道的事件来选择通道进行服务,So Select是监听Channel事件的可以通过通道进行读写每一个通道对应一个BufferBuffer和通道可以相互读写客户端写入Buffer三大组件关系一个channel对应一个Buffer

2021-01-23 16:37:13 91

原创 IO模型 - BIO简介

1.1 Java BIO1.1.1 介绍阻塞型IO,一个链接对应一个线程它所有的接口都在java.io中,可以通过线程池改善1.1.2 流程服务器端启动一个ServerSocket客户端启动Socket进行通信客户端咨询服务端是否有线程响应若有响应,则等待请求结束如果当前线程没有数据可读,则会阻塞在Read上...

2021-01-23 16:33:58 118

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除