《netty实战》笔记 1-8章
第1章
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
此方式(java API阻塞方式):一个客户端——一个线程
--------------------------------
--------------------------------
--------------------------------
回调就是ChannelHandler的方法(一个Handler包含多个回调)
--------------------------------
--------------------------------
一个回调其实就是一个方法,一个指向已经被提供给另外一个方法的方法的引用,多种事件有多种回调【如建立连接,断开连接】
--------------------------------
Channel 类型——EpollServerSocketChannel(Linux) 或 NioServerSocketChannel
--------------------------------
--------------------------------
--------------------------------
连接回调后:Future添加Listener处理连接的多种情况(连接成功,发生错误等),即Future是回调的精细化处理。
--------------------------------
第2章 你的第一款netty应用程序

--------------------------------
EventLoop:顾名思义 事件循环
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
一个ChannelPipeline有一个ChannelHandler实例链,即:一个Channel有一个ChannelHandler实例链(ChannelHandler集合)
--------------------------------
--------------------------------
--------------------------------
--------------------------------
引导ServerBootstrap
--------------------------------
--------------------------------
--------------------------------
--------------------------------
/** * 启动函数,地址和端口号 */ public boolean start(String address, int port, ChannelHandler handler) { boolean isEpoll = Epoll.isAvailable(); int cpuNum = Runtime.getRuntime().availableProcessors(); if (isEpoll) { bossGroup = new EpollEventLoopGroup(cpuNum); workGroup = new EpollEventLoopGroup(cpuNum * 2 + 1); } else { bossGroup = new NioEventLoopGroup(cpuNum); workGroup = new NioEventLoopGroup(cpuNum * 2 + 1); } try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup, workGroup); bootstrap.channel(isEpoll ? EpollServerSocketChannel.class : NioServerSocketChannel.class); bootstrap.handler(new LoggingHandler(LogLevel.INFO)); bootstrap.childHandler(handler); // TIME_WAIT时可重用端口,服务器关闭后可立即重启,此时任何非期 // 望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不可能 bootstrap.option(ChannelOption.SO_REUSEADDR, true); // 设置了ServerSocket类的SO_RCVBUF选项,就相当于设置了Socket对象的接收缓冲区大小,4KB bootstrap.option(ChannelOption.SO_RCVBUF, 1024 * 8); // 请求连接的最大队列长度,如果backlog参数的值大于操作系统限定的队列的最大长度,那么backlog参数无效 bootstrap.option(ChannelOption.SO_BACKLOG, 1024); // 使用内存池的缓冲区重用机制 bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); // 当客户端发生断网或断电等非正常断开的现象,如果服务器没有设置SO_KEEPALIVE选项,则会一直不关闭SOCKET。具体的时间由OS配置 bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); // 在调用close方法后,将阻塞n秒,让未完成发送的数据尽量发出,netty中这部分操作调用方法异步进行。我们的游戏业务没有这种需要,所以设置为0 bootstrap.childOption(ChannelOption.SO_LINGER, 0); // 数据包不缓冲,立即发出 bootstrap.childOption(ChannelOption.TCP_NODELAY, true); // 发送缓冲大小,默认8192 bootstrap.childOption(ChannelOption.SO_SNDBUF, 1024 * 8); // 使用内存池的缓冲区重用机制 bootstrap.childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); bootstrap.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 64, 1024 * 128)); channelFuture = bootstrap.bind(new InetSocketAddress(address, port)); channelFuture.sync();//阻塞,知道绑定操作完成为止 Log.info("NettyComponentSocket->start, service start success address:{} port:{} isEpoll:{}", address, port, isEpoll); return true; } catch (Exception e) { Log.error("NettyComponent->start, init netty exception, address:{} port:{}", address, port, e); return false; } }
--------------------------------
--------------------------------
--------------------------------
最大的区别在于SimpleChannelInboundHandler会对没有外界引用的资源进行一定的清理,并且入站的消息可以通过泛型来规定。

--------------------------------
引导Bootstrap,服务端是local,客户端是remoteAddress
--------------------------------
--------------------------------
--------------------------------
第3章 Netty的组件和设计
--------------------------------
--------------------------------
--------------------------------
一个线程——一个selector(注册表作用) —— 多个客户端——多个Channel
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
服务端两组Channel(EventLoopGroup),一组管理服务端ServerChannel,一组管理传入的客户端连接的Channel。
--------------------------------
第4章 传输
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
每个Channel都将会分配一个ChannelPipeline和ChannelConfig
--------------------------------
拦截过滤器——执行一遍注册的拦截器(Handler方法)
--------------------------------
基于长度的解码器LengthFieldBasedFrameDecoder【继承自ByteToMessageDecoder】:
--------------------------------
如上图, 便是根据设定的规则, 就可以’筛选’出来真正有意义的数据(data)在哪个. 而且允许每个data的长度是不一样大小.

--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
零拷贝特性。nio和 epoll类型传输时才可使用。ByteBuf内置的复合缓冲区类型 零拷贝。
--------------------------------
--------------------------------
--------------------------------
第 5 章 ByteBuf
--------------------------------
--------------------------------
--------------------------------
slice:片,切片
--------------------------------
尽量使用slice替换copy方法,减少复制开销,但是要注意 共享数据问题。
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
第 6 章 ChannelHandler 和 ChannelPipeline
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
第 7 章 EventLoop 和 线程模型
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
第8章 引导
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------

本文作者:好Wu赖
本文链接:https://www.cnblogs.com/erlongxizhu-03/p/17171048.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战