netty学习笔记一
netty是基于nio(非阻塞io)的高性能网络通信框架
什么是阻塞 ?
一直等待在那里,知道有返回值才会处理
例如:
i. Socket socket = serverSocket.accept();
ii. int data = is.read(in);
socket编程基础知识,readline() 与 read区别,byte是为从文件读取提供的缓冲,byte[1024] 一般读取为1024整数倍,看内存的大小;
每个Java程序员都应该记住,Java使用的是Unicode编码。所有的字符在JVM中(内存中)只有一个存在形式就是Unicode。所以一个char占用2字节。当要写入文件中时,就按程序指定的UTF-8编码对“汉字”重新编码。
字符编码参考资料:
https://blog.csdn.net/dream_goon/article/details/37691589
IO模型(一个服务员服务一个客户)
NIO模型(一个服务员可以服务多个客户)
扩展:
epll中内核会自动会写数据回Uer Application
===========================================================================================
AIO(异步io)
jdk7中新增的一些与文件(网络)I/O相关的一些api
资料参考:
https://www.jianshu.com/p/c5e16460047b
缺点:
因为AIO的实施需充分调用OS参与,IO需要操作系统支持、并发也同样需要操作系统的支持,所以性能方面不同操作系统差异会比较明显。
===========================================================================================
BIO:
问题?
1.阻塞
2.一个服务端与一个客户端服务,只有一个客户端断开之后;另一个客户端才能连接
缺点总结:(一个服务端只能为一个客户端服务,在高并发场景下很快耗尽服务器资源)
解决方案(伪异步io):
- 不断的 new Thread()…
问题:不断的创建资源耗尽服务器资源 - 用线程池解决?
问题:底层还是 new Thread(),客户一直连接无法回收 - 用限制了线程数的线程池, 100个?
问题:到了101个的时候就挂掉了,无法服务,必须等待
===========================================================================================
NIO
解决的问题:一个客户端请求接入后,服务端必须创建一个线程来处理这条链路,如果客户端无限增长,服务器资源不够用 , nio就是为了处理大量的客户端连接(高并发)。
nio:
Seletor通道的管理器
ServerSocketChannel(ServerSocket):只关心客户端连接事件
ServerChannel(Socket):关心读写事件
SelectionKey:事件集合
ByteBuffer
- 单线程Reactor模型
client —-> server(Acceptor处理客户端发送的事件,Reactor反应堆转发客户端的请求(相当于Dispatch)
---> Handler(进行具体的操作))
2.多线程Reactor模型
-— 创建多个Reactor反应堆
3.主从多线程Reactor模型
client —-> server(Main Reactor (Acceptor Thread pool)处理客户端发送的事件,Sub Reactor(IO Thread pool)反应堆转发客户端的请求(相当于Dispatch)
---> Handler(进行具体的操作))
还没有评论,来说两句吧...