Netty-群聊系统
服务端12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970package com.jhj.netty.groupchat;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;import io.netty.handler.codec.string.StringDecoder;import io.nett ...
Netty 核心模块组件
Bootstrap、ServerBootstrap
Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是服务端启动引导类
常见的方法有• public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup),该方法用于服务器端,用来设置两个 EventLoop• public B group(EventLoopGroup group) ,该方法用于客户端,用来设置一个 EventLoop• public B channel(Class<? extends C> channelClass),该方法用来设置一个服务器端的通道实现• public B option(ChannelOption option, T value),用来给 ServerChannel 添加配置• public Serve ...
Neety快速入门实例-HTTP服务
服务启动端123456789101112131415161718192021222324252627282930313233package com.jhj.netty.http;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;public class TestServer { public static void main(String[] args) throws Exception{ EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup wor ...
异步模型-Netty
基本介绍
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的组件在完成后,通过状态、通知和回调来通知调用者。
Netty 中的 I/O 操作是异步的,包括 Bind、Write、Connect 等操作会简单的返回一个ChannelFuture。
调用者并不能立刻获得结果,而是通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果
Netty 的异步模型是建立在 future 和 callback 的之上的。callback 就是回调。重点说Future,它的核心思想是:假设一个方法 fun,计算过程可能非常耗时,等待 fun返回显然不合适。那么可以在调用 fun 的时候,立马返回一个 Future,后续可以通过Future去监控方法 fun 的处理过程(即 : Future-Listene
Future 说明
表示异步的执行结果, 可以通过它提供的方法来检测执行是否完成,比如检索计算等等.
ChannelFuture 是一个接口 : public interface ChannelFut ...
Netty模型
Netty模型工作原理示意图1-简单版Netty 主要基于主从 Reactors 多线程模型(如图)做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor
BossGroup 线程维护Selector , 只关注Accecpt
当接收到Accept事件,获取到对应的SocketChannel, 封装成 NIOScoketChannel并注册到Worker 线程(事件循环), 并进行维护
当Worker线程监听到selector 中通道发生自己感兴趣的事件后,就进行处理(就由handler), 注意handler 已经加入到通道
工作原理示意图2-进阶版Netty 主要基于主从Reactors 多线程模型(如图)做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor
工作原理示意图-详细版
Netty抽象出两组线程池 BossGroup 专门负责接收客户端的连接, WorkerGroup 专门负责网络的读写
BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup
NioEventLoopGroup 相当 ...
SpringSession 前后端使用Cookie
后端12345678910111213141516171819202122232425262728293031323334353637package com.jhj.gulimall.auth.server.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import javax.servlet.http.HttpSession;import java.util.HashMap;@Controllerpublic class LoginController { @GetMapping("/login") public void loginPage(HttpSession session){ HashMap ...
Netty 线程模型介绍
线程模型基本介绍
目前存在的线程模型有:传统阻塞 I/O 服务模型Reactor 模式
根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现• 单 Reactor 单线程;• 单 Reactor 多线程;• 主从 Reactor 多线程
Netty 线程模式(Netty 主要基于主从 Reactor 多线程模型做了一定的改进,其中主从Reactor 多线程模型有多个 Reactor
传统阻塞 I/O 服务模型工作原理图黄色的框表示对象, 蓝色的框表示线程白色的框表示方法(API)
模型特点
采用阻塞IO模式获取输入的数据
每个连接都需要独立的线程完成数据的输入,业务处理, 数据返回
问题分析
当并发数很大,就会创建大量的线程,占用很大系统资源
连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read 操作,造成线程资源浪费
Reactor 模式针对传统阻塞 I/O 服务模型的 2 个缺点,解决方案:
基于 I/O 复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。 ...
Netty初始
为什么原生NIO存在的问题
NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。
需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。
开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。
JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU 100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。
是什么Netty官网说明官网:https://netty.io/Netty is an asynchronous event-driven network application frameworkfor rapid development of maintainable high performance protocol ser ...
NIO与零拷贝
零拷贝基本介绍
零拷贝是网络编程的关键,很多性能优化都离不开。
在 Java 程序中,常用的零拷贝有 mmap(内存映射) 和 sendFile。那么,他们在OS 里,到底是怎么样的一个的设计?我们分析 mmap 和 sendFile 这两个零拷贝
另外我们看下NIO 中如何使用零拷贝
传统IO数据读写
Java 传统 IO 和 网络编程的一段代码123456File file = new File("test.txt");RandomAccessFile raf = new RandomAccessFile(file, "rw");byte[] arr = new byte[(int) file.length()];raf.read(arr);Socket socket = new ServerSocket(8080).accept();socket.getOutputStream().write(arr);
DMA: directmemory access直接内存拷贝(不使用CPU)
mmap 优化
mmap 通过内存映射,将文件映射到内 ...
NIO实现简单群聊系统
服务端123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168package com.jhj.nio.groupchat;import java.io.IOException;import java.net.InetSocketAddress;import jav ...