共计 2429 个字符,预计需要花费 7 分钟才能阅读完成。
1. 什么是 Netty
2.Netty 的应用场景
3.Netty 的学习程序
4.BIO 根本介绍
5.BIO 的流程梳理
6.BIO 利用实例阐明
7.BIO 优缺点剖析
1. 什么是 Netty
在咱们的日常开发中,依照失常的工作模式,个别都是确定好业务逻辑之后,提供接口 给客户端端,而后 进行调用 即可,也就是说调用一般的接口,生产者和消费者的角色是固定的,永远都是客户端是消费者,服务器端是生产者。
然而咱们试想一下这种状况,客户端须要和服务器端 放弃长链接 ,并且会 相互推送音讯 (比如说聊天服务器),这个时候,像这种 点对点 ,且相互发送信息的状况下, 一般的接口调用曾经无奈满足咱们的业务要求,咱们须要一个与服务器通信相干的框架。
再比方,有十分多的客户端连贯到咱们的服务器 ,咱们如何 将这些连贯申请正当地进行编排,让线程失去充沛的利用,而不是阻塞。
Netty就十分适合。
Netty 是 一个 异步事件驱动的网络应用程序框架 ,用于 疾速开发可保护的高性能协定服务器和客户端。
2.Netty 的应用场景
2.1)分布式系统的框架中
在分布式系统中,服务和服务之间如何放弃连贯 ,如果进行近程服务调用,高性能的 RPC 框架必不可少,Netty 作为异步高性能的通信框架,作为通信的根底组件被这些框架应用。
2.2)通信行业
在通信行业中,往往会有大量的用户同时在线,并且发送信息,如果高效地解决这些链接,并且高效的散发数据,Netty 提供了解决方案。
3.Netty 的学习程序
刚开始学习 Netty, 咱们不宜讲太多 Netty 的概念,因为初听这些词汇十分难懂,咱们要从 BIO 开始,再学习NIO( 学会 NIO 三大外围工具),学完后咱们会对网络编程有一个初步的理解,也会对服务器中解决连贯的模式有一个大略的印象,等到这些根底都学会之后,接下来咱们就能够系统地学习 Netty。
4.BIO 根本介绍
咱们先看一下 BIO 的概念: 同步阻塞。
每当服务器有连贯申请的时候 ,客户端 都会启动一个线程去解决(能够通过线程池改善)。
服务器端 在筹备数据的时候 ,服务器的 这个连接线程是不会去做任何事件的 ( 阻塞状态)。
由此咱们能够得出:
BIO实用于连贯数目比拟小且固定的架构,对服务器资源要求高。
5.BIO 的工作流程梳理
5.1)服务器端启动一个 ServerSocket
5.2)客户端启动 Socket 对服务器进行通信,默认状况下 每个客户端申请都须要建设一个连贯与之通信
5.3)客户端发出请求后, 先征询服务器是否有线程响应,如果没有则会期待,或者被回绝
5.4)如果有响应,客户端线程会期待申请完结后,在继续执行
5.5)客户端在 解决读写申请的时候 , 直至业务逻辑解决完返回数据以前 ,连贯客户端的 线程会阻塞 ,不会去做其它事件, 始终是阻塞状态。
5.6)服务器端解决完数据返回给客户端。
6.BIO 利用实例阐明
@Slf4j
public class BIOServer {public static void main(String[] args) throws Exception {
// 如果有客户端连贯,就创立一个线程,与之通信
ThreadPoolExecutor threadPoolExecutor
= new ThreadPoolExecutor(2,// 常驻外围线程数
5,// 最大外围线程数
1L,// 多余的闲暇线程的存活工夫
TimeUnit.SECONDS,// 多余闲暇线程存活工夫单位
new ArrayBlockingQueue<Runnable>(10),// 阻塞队列
Executors.defaultThreadFactory(),// 生成线程池中工作线程的线程工厂
new ThreadPoolExecutor.AbortPolicy());// 回绝策略
ServerSocket serverSocket = new ServerSocket(6677);
log.info("服务器启动");
while (true) {log.info("线程 id" + Thread.currentThread().getId() + "名字 =" + Thread.currentThread().getName());
// 期待客户端连贯
log.info("期待客户端连贯");
// 没有连贯会阻塞在这里
Socket accept = serverSocket.accept();
log.info("有客户端连贯了!");
// 解决的业务逻辑
threadPoolExecutor.execute(() -> handler(accept));
}
}
public static void handler(Socket socket) {
try {log.info("线程 id" + Thread.currentThread().getId() + "名字 =" + Thread.currentThread().getName());
// 通过 socket 连贯获取输出流
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
while(true){int read = inputStream.read(bytes);
if (read != -1) {System.out.println(new String(bytes, 0, read));// 输入客户端发送的数据
} else {break;}
}
} catch (Exception e) {log.error(e.getMessage());
} finally {
try {socket.close();
} catch (IOException e) {e.printStackTrace();
}
}
}
}
咱们通过 telnet 连贯服务器:
随便输出字符串发送信息:
7.BIO 优缺点剖析
长处:
1)开发简略。
毛病:
1)每个 申请都要创立线程,浪费资源。
2)连贯建设后,如果服务端的数据还没有筹备好,则服务端线程不会去解决别的申请,会阻塞,造成资源节约。
咱们将会用 NIO 等形式 来解决以上的毛病。