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等形式来解决以上的毛病。