乐趣区

关于java:Netty网络编程Netty的基本介绍与BIO

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

退出移动版