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利用实例阐明
@Slf4jpublic 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等形式来解决以上的毛病。