当前位置:网站首页>NiO related knowledge (II)
NiO related knowledge (II)
2022-07-06 01:35:00 【Certainly tomorrow】
Looking back
NIO Relevant knowledge points ( One )_ If you have bad luck, try to make it up -CSDN Blog NIO?selector?epoll? I don't understand it https://blog.csdn.net/wai_58934/article/details/122898928?spm=1001.2014.3001.5501 Then continue to write yesterday .
The important thing is to call the three underlying functions , Namely
epoll_create: Generate a epoll Dedicated file descriptors . It actually applies for a space in the kernel , Used to store what you want to focus on socket fd Whether it happened and what happened
epoll_ctl:epoll The event registration function , Used to control a epoll Events on the file descriptor , You can register Events , Modify event , Delete event .
epoll_wait: Waiting for the event to happen , This function returns the number of events to be processed . Waiting to register at epfd Upper socket fd The occurrence of the event , If it happens, it will happen sokct fd And event types into events Array . And will register at epfd Upper socket fd The event type of , So if you want to focus on this in the next cycle socket fd Words , You need to use epoll_ctl To reset socket fd The type of event .
Reactor Respond to programming patterns
Reactor Encapsulates the selector.
Reactor The design pattern is event-driven architecture
An implementation of , It is used to handle the scenario of multiple clients requesting services from the server concurrently . Each service may consist of multiple methods on the server .Reactor The service of concurrent requests will be decoupled and distributed to the corresponding time processor for processing .
Reactor The advantages of the model are obvious : decoupling 、 Improve reusability 、 modularization 、 Portability 、 Event driven 、 Fine grained development control, etc .Reactor The disadvantages of the model are also obvious : Complex model , Involving internal callback 、 Multithreading 、 Not easy to debug 、 The underlying support of the operating system is required , Therefore, different operating systems may produce different results .
yesterday NIO( Please review the above article link ) Although used selector, however disadvantages Still very big , Because it processes read and write events serially , If 100000 read / write events are being processed , Enter another connection , You need to wait for the previous event to be processed , Poor performance . Optimize : Put the read event into the thread pool for processing ( Establish connection events faster , There is no need to put it into the thread pool ). however , After adding the thread pool, it still Not in time Handle new requests ( Threads cannot be opened too much , It will cause memory overflow ). At this time, an excellent idea was born , Master-slave reactor The responsive model . One reactor Used to establish a connection , One reactor Deal with reading events .netty On this basis, improvements have been made , One master, many followers , Distribute events , In this way, the efficiency will be improved a lot . The above descriptions are : Single thread Reactor Model 、 Multithreading Reactor Model 、 Master-slave Reactor Model . You can compare the difference from the figure :
Take a look at netty To get started demo. Learn more about logic from the code .
The main thing is Create a startup object 、 Set the startup object 、 Binding port The three steps .
public static void main(String[] args) {
//boosGroup Only handle connection requests , The real business request is made by workGroup Handle
// In essence, it is to create n individual selector To deal with , Corresponding to the master-slave mentioned above
NioEventLoopGroup boosGroup = new NioEventLoopGroup(1);
NioEventLoopGroup workGroup = new NioEventLoopGroup(8);
try {
// Create a server-side startup object
ServerBootstrap bootstrap = new ServerBootstrap();
// Chain programming configures the startup object
bootstrap.group(boosGroup,workGroup)
.channel(NioServerSocketChannel.class) // Set the channel to achieve
.option(ChannelOption.SO_BACKLOG,1024) // Initialize server connection queue size , Put those that cannot be processed into the queue
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new NettyServerHandler());// Set up the processor , Focus on processing logic
}
});
System.out.println("netty server start");
// Binding port ,bind Is asynchronous ,sync To ensure the completion of asynchronous execution
ChannelFuture sync = bootstrap.bind(9000).sync();
// ditto , close future
sync.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
}finally {
boosGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
Event implementation , Inherit ChannelInboundHandlerAdapter Rewrite the business you want to achieve .
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println(" Successful connection ");
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf result = (ByteBuf) msg;
byte[] bytesMsg = new byte[result.readableBytes()];
result.readBytes(bytesMsg);
String resultStr = new String(bytesMsg);
System.out.println(" The data is :"+resultStr);
result.release();
}
}
边栏推荐
- Docker compose配置MySQL并实现远程连接
- 2022 Guangxi Autonomous Region secondary vocational group "Cyberspace Security" competition and its analysis (super detailed)
- Code review concerns
- WGet: command line download tool
- Maya hollowed out modeling
- [le plus complet du réseau] | interprétation complète de MySQL explicite
- Folio.ink 免费、快速、易用的图片分享工具
- Leetcode skimming questions_ Verify palindrome string II
- TrueType字体文件提取关键信息
- 黄金价格走势k线图如何看?
猜你喜欢
c#网页打开winform exe
Huawei Hrbrid interface and VLAN division based on IP
[understanding of opportunity-39]: Guiguzi - Chapter 5 flying clamp - warning 2: there are six types of praise. Be careful to enjoy praise as fish enjoy bait.
[flask] official tutorial -part1: project layout, application settings, definition and database access
黄金价格走势k线图如何看?
Basic process and testing idea of interface automation
yii中console方法调用,yii console定时任务
[detailed] several ways to quickly realize object mapping
【Flask】官方教程(Tutorial)-part2:蓝图-视图、模板、静态文件
DOM introduction
随机推荐
Alibaba canal usage details (pit draining version)_ MySQL and ES data synchronization
一圖看懂!為什麼學校教了你Coding但還是不會的原因...
leetcode刷题_反转字符串中的元音字母
Recommended areas - ways to explore users' future interests
Initialize MySQL database when docker container starts
【Flask】官方教程(Tutorial)-part1:项目布局、应用程序设置、定义和访问数据库
You are using pip version 21.1.1; however, version 22.0.3 is available. You should consider upgradin
[flask] static file and template rendering
晶振是如何起振的?
【Flask】获取请求信息、重定向、错误处理
[le plus complet du réseau] | interprétation complète de MySQL explicite
【全网最全】 |MySQL EXPLAIN 完全解读
MCU lightweight system core
File upload vulnerability test based on DVWA
About error 2003 (HY000): can't connect to MySQL server on 'localhost' (10061)
[flask] official tutorial -part1: project layout, application settings, definition and database access
Development trend of Ali Taobao fine sorting model
Unity | 实现面部驱动的两种方式
Kotlin basics 1
internship:项目代码所涉及陌生注解及其作用