随笔分类 -  Netty

摘要:5.1、Redis协议 //redis协议测试 public class TestRedis { public static void main(String[] args) { final byte[] line = {13, 10}; NioEventLoopGroup group = new 阅读全文
posted @ 2022-10-24 15:04 jpy 阅读(54) 评论(0) 推荐(0) 编辑
摘要:4、解决方案 4.1、短连接 以解决黏包为例。服务端同上,客户端如下 //短连接处理黏包,发送后关闭 public class TestSloveNianbaoClient { public static void main(String[] args) { for (int i = 0; i < 阅读全文
posted @ 2022-10-24 15:02 jpy 阅读(94) 评论(0) 推荐(0) 编辑
摘要:Netty进阶 1、黏包 服务端 //测试黏包服务端 @Slf4j public class TestNianbaoServer { public static void main(String[] args) { NioEventLoopGroup boss = new NioEventLoopG 阅读全文
posted @ 2022-10-24 14:59 jpy 阅读(51) 评论(0) 推荐(0) 编辑
摘要:3.5、ByteBuf 3.5.1、创建 //结果:初始容量256,扩容到512 //PooledUnsafeDirectByteBuf(ridx: 0, widx: 0, cap: 256) //PooledUnsafeDirectByteBuf(ridx: 0, widx: 300, cap: 阅读全文
posted @ 2022-10-24 14:51 jpy 阅读(496) 评论(0) 推荐(0) 编辑
摘要:3.4、Handler & Pipeline ChannelHandler 用来处理 Channel 上的各种事件,分为入站、出站两种。所有 ChannelHandler 被连成一串,就是 Pipeline 入站处理器通常是 ChannelInboundHandlerAdapter 的子类,主要用来 阅读全文
posted @ 2022-10-24 14:49 jpy 阅读(37) 评论(0) 推荐(0) 编辑
摘要:3.3、Future & Promise Netty中的Future与Jdk中Future同名,但是是两个接口, 继承关系:Promise extends-->Future(Netty) extend >Future(JDK) 区别: jdk Future 只能同步等待任务结束(或成功、或失败)才能 阅读全文
posted @ 2022-10-24 14:48 jpy 阅读(74) 评论(0) 推荐(0) 编辑
摘要:3.2、Channel close() 关闭channel closeFuture() 用来处理channel的关闭 sync() 同步等待channel关闭 addListener() 异步等待channel关闭 pipeline() 添加处理器 write() 将数据写入缓冲区,但不会立即输出 阅读全文
posted @ 2022-10-24 14:46 jpy 阅读(89) 评论(0) 推荐(0) 编辑
摘要:3、组件 3.1、EventLoop 事件循环对象EventLop EventLoop 本质是一个单线程执行器(同时维护了一个 Selector),里面有 run 方法处理 Channel 上源源不断的 io 事件。 继承关系: 一条线是继承自 j.u.c.ScheduledExecutorServ 阅读全文
posted @ 2022-10-24 14:43 jpy 阅读(112) 评论(0) 推荐(0) 编辑
摘要:Netty入门 1、Netty优势 Netty VS NIO,工作量大,bug多 需要自己构建协议 解决TCP传输问题,如黏包,半包 epoll空轮询导致cpu 100% 对API进行增强,ThreadLocal-->FastThreadLocal,ByteBuffer-->ByteBuf 2、He 阅读全文
posted @ 2022-10-24 14:24 jpy 阅读(24) 评论(0) 推荐(0) 编辑
摘要:1.5.6、文件异步AIO @Slf4j public class AIOTest { public static void main(String[] args) { try { AsynchronousFileChannel channel = AsynchronousFileChannel.o 阅读全文
posted @ 2022-10-12 13:46 jpy 阅读(18) 评论(0) 推荐(0) 编辑
摘要:1.5.3、零拷贝 传统IO java 本身并不具备 IO 读写能力,因此 read 方法调用后,要从 java 程序的用户态切换至内核态,去调用操作系统(Kernel)的读能力,将数据读入内核缓冲区。这期间用户线程阻塞,操作系统使用 DMA(Direct Memory Access)来实现文件读, 阅读全文
posted @ 2022-10-12 13:44 jpy 阅读(24) 评论(0) 推荐(0) 编辑
摘要:1.5、NIO BIO 1.5.1、Stream Channel stream 不会自动缓冲数据,channel 会利用系统提供的发送缓冲区、接收缓冲区(更为底层) stream 仅支持阻塞 API,channel 同时支持阻塞、非阻塞 API,网络 channel 可配合 selector 实现多 阅读全文
posted @ 2022-10-12 13:39 jpy 阅读(18) 评论(0) 推荐(0) 编辑
摘要:1.4.5、多线程多work轮询 @Slf4j public class ThreadServerWorks { public static void main(String[] args) throws IOException, InterruptedException { Thread.curr 阅读全文
posted @ 2022-10-12 13:31 jpy 阅读(43) 评论(0) 推荐(0) 编辑
摘要:1.4.4、多线程优化 设计思路:分两组选择器 单线程配一个选择器,专门处理accpet事件(建立连接) BOSS 创建多线程,每个线程一个选择器,专门处理read事件 WORK 服务端 @Slf4j public class ThreadServer { public static void ma 阅读全文
posted @ 2022-10-12 13:30 jpy 阅读(45) 评论(0) 推荐(0) 编辑
摘要:1.4.3、写入内容过多 服务端 public class WriteServer { public static void main(String[] args) throws IOException { ServerSocketChannel ssc = ServerSocketChannel. 阅读全文
posted @ 2022-10-12 13:27 jpy 阅读(36) 评论(0) 推荐(0) 编辑
摘要:1.4.2、selector 单线程可以配合 Selector 完成对多个 Channel 可读写事件的监控,这称之为多路复用 只能用于网络IO,文件IO不可用,因为FileChannel没有阻塞模式 如果不用selector多路复用,线程一直在做无用功。selector能够 有可连接事件才去连接 阅读全文
posted @ 2022-10-12 13:24 jpy 阅读(85) 评论(0) 推荐(0) 编辑
摘要:1.4、网络编程 1.4.1 阻塞VS非阻塞 阻塞: ServerSocketChannel.accept() 阻塞到客户端连接 SocketChannel.read() 阻塞到客户端发送数据 //服务端 @Slf4j public class SocketServerTest { public s 阅读全文
posted @ 2022-10-12 13:22 jpy 阅读(39) 评论(0) 推荐(0) 编辑
摘要:1.3、文件编程 1.3.1、FileChannel 获取 FileInputStream 只能读 FileOutStream 只能写 RandomAccessFile 构造传参决定 rw:读写 读取 从channel读取填充到buffer channel.read(buffer); 返回读到的字节 阅读全文
posted @ 2022-10-12 13:19 jpy 阅读(29) 评论(0) 推荐(0) 编辑
摘要:1.2.3、ByteBuffer常见方法 public class TestBufferRead { public static void main(String[] args) { ByteBuffer buffer = ByteBuffer.allocate(10); buffer.put(ne 阅读全文
posted @ 2022-10-12 13:16 jpy 阅读(96) 评论(0) 推荐(0) 编辑
摘要:1.2、ByteBuffer 1.2.1、使用 代码示例 准备一个文本,内容:1234567890abcd channel操作文本 @Slf4j public class TestByteBuffer { public static void main(String[] args) { try { 阅读全文
posted @ 2022-10-12 13:13 jpy 阅读(79) 评论(0) 推荐(0) 编辑