OKOK,废话不多说。我回来了。还记得刷完牛客哭得不行的我吗。回首去年太惨了太惨了。好在今年7月份毕业到至今,结果还不算太惨。哈哈哈。
进入主题,进入主题,施主莫闹,施主莫慌。
大兵长今天被人怼了!!(enmmm博主名称大兵在,打错字了不要在意细节。)
事出有因,听我慢慢到来。
是这样,今天在地铁上,很挤很挤,一个大帅比给一个大漂亮美美讲netty,那叫一个装13,说的我差点都信了。
大兵长能忍?不能、于是上前说道,放开那个大漂亮,让我先来 。
当时是这样的,
前方高能:
妹妹:啊,你想干嘛。你能告诉我Netty是什么吗?
大兵长:那,那,那必须滴。showTime.
可是,可是,脑子翻江倒海。只有妹妹的漂亮,Netty到底在哪里。呀。在这嘞。
我慢慢进入到里面,一步一步的进入。
呀,快进去了。我的知识海洋,看到了一丢丢。
一:赶紧介绍一下
1. Netty主要是用于服务器通讯相关的各种各类的场景。本质其实也就是一个NIO框架啦。
2. 你去Github上能发现,这就是一个独立的项目,是由JBOSS提供的一个开源框架。
3. 还是异步嘞,基于事件驱动的一个贼牛逼,用于快速开发高性能,高可靠性的网络IO程序。 主要是针对TCP协议,面向客户端高并发应用。
妹妹:手,放哪儿呢。
大兵长:嘿嘿,不好意思。
妹妹:你说本质是NIO,那是不是想要深入了解和学习Netty就必须要先搞一下NIO啊。
大兵长:呦呵,你这个搞很有感觉,那我来给你搞一下NIO.
妹妹:好呀好呀。搞好了,有奖励哦。
废话少说,妹妹都说了,直接走起,进入更深,一眼望去,竟然是黑森林。看来NIO要来了。
不对不对,这之前先从0开始吧。
二:I/O模型
其实IO模型这玩意儿,妹妹应该是听过的。但还是要给他讲一下。毕竟妹妹学过JAVA基础的吗。
1:IO大家都知道,其实也就是进进出出吗。IO模型也就是进出的模型啦。
2:IO模型:咱们用啥通道进行这个数据的进出(发送和接收)。
3:现在JAVA支持的有三种网络编程模型IO模式:BIO,AIO,NIO
行吧,不喜欢深入的男人不是好男银。
(1)BIO是个啥
BIO,blockIO,block阻塞,同步的IO模型。
传统滴模型,一个连接对应一个线程滴。(海底捞,你吃饭,服务员小姐姐只盯着你,啥也不做,为你服务撒!! you see? you see?)客户端有连接请求(你吃饭),服务器端(海底捞)就要启动一个线程(服务员小姐姐)进行处理。你不吃,人家一直盯着你,小姐姐本来可以做其他事,结果你来了,啥也不做,人家不就浪费时间在你身上了吗。(造成不必要的线程开销)。
(2)NIO是个啥
NIO:是一个同步非阻塞的模型,服务器实现的模式是一个线程处理好多个请求。为啥会这样,因为多了个多路复用器,这个玩意儿就牛逼格拉斯了,他会不断的轮询到连接有IO请求的就会去处理。(海底捞(服务器)搞了一个红领巾小分队,在那一会儿看看这看看哪儿。你想加酸梅汤,他就过来给你加,然后他再回去小分队带着,等待别人是否需要加酸梅汤啦。)
(3)AIO是个啥
AIO啊其实是NIO的加强版也就是NIOplus,异步非阻塞,AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间较长的应用。
他们都用在哪里?
应用场景何在?
1:BIO同步阻塞,是同步的且阻塞的,一般用在连接数较少的情况下。而且对服务器资源要求较高。
1对1吗。线程消耗较多啦。jdk1.4之前只能用它了。并发还有局限,你懂得。
2:NIO同步非阻塞。JDK1.4之后都用它。他牛逼啊,连接数多连接短,就是不要一直连接吗。
还要接受其他请求呢。像我们聊天服务器,服务间通信等,这都是短时连接。所以用它比较好。
3:AIO nioplus版本。jdk7才开始支持的,但是很少有,多用于连接数多连接长。
什么啊?你要我写一个BIO的例子给你?
可不可以不写啊,算了看你好看。还是写一个吧。
你看这是流程,很明显我们能知道以下几件事。
1:我们要创建一个服务端吧(海底捞总部)
2:也要搞几个客户吧。(比如大兵长这个逼)
3:也要搞几个线程吧(服务员),如果有能分配给你的服务员,就给你加酸梅汤呗。不然就只能让你等了。
package com.lidadaibiao.biotest;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
/**
* @author dadaibiaoLi
* @Desc 海底捞服务器
* @Date 2021/12/22 12:34
*/
public class HAIDILAOServer {
public static void main(String[] args) throws IOException {
//这里寻思搞个线程池吧,毕竟服务员那么多,总不能来一个人打电话叫一个小姐姐过来吗。这岂不是赔死
ThreadPoolExecutor fuwuyuanPool = new ThreadPoolExecutor(5, 20, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<>(5));
//创建一个海底捞 (ServerSocket) 和客户达成共识进来输入6666进行通信点餐
ServerSocket haidilaoServer = new ServerSocket(6666);
System.out.println("海底捞分部 开业啦。(服务器启动~~~~~~~~~)");
//ok现在开始循环通信
while (true){
System.out.println("海底捞分部(线程)信息id = " + Thread.currentThread().getId() + "名字 = " + Thread.currentThread().getName());
//监听,等待客户端连接
System.out.println("等待连接....");
// 通信 连接 最终会阻塞在accept()
final Socket socket = haidilaoServer.accept();
System.out.println("呦呵,一个客户来了~~~");
//出来一个服务员小姐姐(创建一个线程)去服务(通信)
fuwuyuanPool.execute(new Runnable() {
@Override
public void run() {
//开始服务(通讯)
fuwu(socket);
}
});
}
}
//服务方法(通讯方法)
private static void fuwu(Socket socket) {
try {
System.out.