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