netty

news2024/10/1 23:45:48

Netty的介绍

Netty是异步的(指定回调处理)、基于事件驱动的网络应用框架,用于快速开发高性能、高可靠性的网络IO程序。

Netty本质是一个NIO框架,适用于服务器通讯相关的多种应用场景,分布式节点远程调用中Netty往往作为RPC框架使用,如Dubbo

层级结构

Netty

NIO(io、网络)

jdk原生io编程和网络编程

最底层是tcp+ip

IO模型:

BIO(原生的javaIO,同步并阻塞)

同步并阻塞:客户端一个连接请求对应一个线程。如果连接非常多,那么线程会非常多,对服务器压力增大

BIO使用场景:适合用连接数小且固定的架构,对服务器资源要求高

BIO编程

1.服务端启动一个ServerScoket

2.客户端启动Socket对服务器进行通信,默认情况下服务器端需要对每个客户端建立一个线程与之通信

3.客户端发出请求后,先咨询服务器是否有线程响应

  • 如果没有则会等待或者被拒绝;

  • 如果有响应,则客户端线程会等待请求结束后,再继续执行。(有阻塞)

public class BIOServer {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("服务器启动了~~~");
        //1.创建线程池
        ExecutorService threadPool = Executors.newCachedThreadPool();
        //2.有客户端连接,就创建一个线程,与之通信
        while (true){
            //监听,等待客户端连接
            final Socket socket = serverSocket.accept();
            System.out.println("连接到一个客户端");
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    //和客户端通讯
                    handler(socket);
                }
            });
        }

    }


    //handler客户端通讯方法
    public static void handler(Socket socket){
        try {
            System.out.println("线程信息 id="+Thread.currentThread().getId()+"名字="+Thread.currentThread().getName());
            byte[] bytes = new byte[1024];
            InputStream inputStream = socket.getInputStream();
            //循环读取客户端数据到bytes数组
            while(true){
                //len是读入缓存区的字节总数
                int len = inputStream.read(bytes);
                if(len !=-1){
                    //!=-1 表示可以继续读
                    // 输出客户端发送的数据
                    System.out.println(new String(bytes,0,len));
                }else {
                    //读取完毕跳出循环
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //关闭socket连接
                System.out.println("关闭和客户端的连接");
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

win+r打开小黑框

telnet 127.0.0.1 6666

如果cmd提示:telnet不是内部或外部命令,也不是可运行的程序怎么办
控制面板-程序和功能-启用或关闭Windows功能-从列表中选中“Telnet客户端”项,点击“确定”按钮
键入:ctrl+]

send命令发送数据:send xiaoyumao

在idea的控制台打印如下

BIO存在的问题:

  1. 当并发数较大时。需要创建大量线程来处理连接,系统资源占用较大

  1. 连接建立后,如果当前线程暂时没有数据可读,则线程会阻塞在read操作,造成线程资源浪费


NIO(同步非阻塞)

同步非阻塞:一个线程处理多个连接请求,所有连接请求都会注册到多路复用器Selector上,多路复用器轮询到连接有IO请求就进行处理

NIO使用场景:适用于连接数目多且连接比较短的架构

NIO有3大核心组件,Selector、Channel、Buffer

Buffer和通道可以相互读写,程序和Buffer交互,所以NIO是面向缓冲区的编程

每个Channel对应一个Buffer

每个Selector对应一个线程,一个线程对应多个channel(连接)

程序切换到哪个Channel是由事件Event决定的,Selector会根据不同的事件,在各个通道上切换

Buffer是一个内存块,底层是一个数组

  1. NIO数据的读取和写入都是通过Buffer,这是和BIO的本质不同。

  1. BIO中要么是输入流要么是输出流,不是双向的。NIO中Buffer可以读可以写,需要flip切换


AIO(异步非阻塞)

异步非阻塞:引入异步通道,采用Proacor模式。

AIO使用场景:适用于连接数目多且连接比较长的架构


NIO-Buffer

BIO以流的方式处理数据,NIO以块(面向Buffer)处理数据,NIO效率比BIO高很多,且NIO是非阻塞的,而BIO是阻塞的

Buffer类和常用子类

Buffer是一个抽象类,常用子类如下

网络传输都是用字节传输的,故用的最多的ByteBuffer:存储字节数据到缓冲区


ByteBuffer的常用方法


Buffer的4个标志位

public abstract class Buffer {
    // Invariants: mark <= position <= limit <= capacity
    private int mark = -1;
    private int position = 0;
    private int limit;
    private int capacity;
}

capacity:容量,在缓冲区创建时被设定且不能改变

limit:缓冲区的当前终点,不能对>=limit的位置读写操作

position:下一个要被读或写的元素索引

mark:标记(很少修改)


flip方法的作用

public final Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

IntBuffer的基本使用

public class BasicBuffer {
    public static void main(String[] args) {
        //创建一个大小为5的buffer,可以存放5个int
        IntBuffer intBuffer = IntBuffer.allocate(5);
        //向buffer存放数据
        intBuffer.put(1);
        intBuffer.put(2);
        intBuffer.put(3);
        intBuffer.put(4);
        intBuffer.put(5);
        //将intBuffer读写切换
        intBuffer.flip();
        //从buffer读取数据
        while (intBuffer.hasRemaining()){
            //每取一次,则指针后移一位
            System.out.println(intBuffer.get());
        }
    }
}

idea运行效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RTT 消息邮箱

1.邮箱概念 邮箱服务是实时操作系统中一种典型的线程间通信方法。举一个简单的例子&#xff0c;有两个线程&#xff0c;线程 1 检测按键状态并发送&#xff0c;线程 2 读取按键状态并根据按键的状态相应地改变 LED 的亮灭。这里就可以使用邮箱的方式进行通信&#xff0c;线程 …

SpringCloud保姆级搭建教程五---Redis

首先&#xff0c;这个和微服务没有直接的关系&#xff0c;只是在代码开发当中要使用的一个工具而已&#xff0c;为了提高这个系统的性能&#xff0c;加快查询效率等方面而使用它1、首先&#xff0c;要先安装redis到电脑上&#xff0c;这里依然是在windows上演示&#xff0c;之后…

window11, WSL, Ubuntu 20.04 编译TensorRT源码并且安装 TensorRT

一、安装参考 1.ubuntu18.04TensorRT 配置攻略 ubuntu18.04TensorRT 配置攻略 - 简书卷积网络的量化和部署是重要环节&#xff0c;以前我们训练好模型后直接trace进行调用&#xff0c;参考&#xff08;C windows调用ubuntu训练的PyTorch模型&#xff08;.pt/.pth&#xff09;…

Utkuici:一款功能强大的Nessus自动化任务实现工具

关于Utkuici 今天&#xff0c;随着信息技术系统的普及&#xff0c;网络安全领域的投资已大幅增加。各种规模的组织都需要进行漏洞管理、渗透测试和各种分析&#xff0c;以准确确定各自机构受网络威胁的影响程度。通过借助漏洞管理工具的行业领先者Tenable Nessus&#xff0c;我…

若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】

昨天情人节一(&#xffe3;︶&#xffe3;*)) 送给赛利亚一((*&#xffe3;3&#xffe3;)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 修改后的页面&#xff1a; 干干净净贼舒服一Ψ(&#xffe3;∀&#xffe3;)Ψ——Ψ(&#xffe3;∀&#x…

Vue一个项目兼容每个省份的个性化需求

开发环境及打包指令 后拼上省份区划"serve:henan": "yarn && vue-cli-service serve -o --encryptSM2 --zone41","serve:hunan": "yarn && vue-cli-service serve -o --encryptSM2 --zone43","serve:guizhou&quo…

电子技术——多阶放大器

电子技术——多阶放大器 实际上的商用放大器是由多个单阶放大器联级而成的多阶放大器。首先第一阶&#xff08;输入&#xff09;通常提供一个较大的输出阻抗来保证较小的信号衰减。若是差分放大器&#xff0c;还要保证有较大的共模抑制比。中间各阶放大器负责提供电压增益&…

wireshark在流媒体分析中常见操作

Wireshark Wireshark&#xff08;前称Ethereal&#xff09;是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换。 在流媒体相关工作中&am…

学英语的优势已来,抓住这个机会

文 / 冰雪&#xff08;微信公众号&#xff1a;王不留&#xff09; ChatGPT大火&#xff0c;国外的商业价值还没找到&#xff0c;咱们这边已经开始变现了。谷雨小姐姐昨天在”一起学英语”微信群发了一张“收割韭菜”的文案截图。 299入社群&#xff0c;服务内容为&#xff1a;免…

卷严重、难度高、激励少,如何适应空投市场新变化

自从空投交互从2020年开始之后&#xff0c;不少人都开始加入到空投交互的行列中&#xff0c;一些项目也因为“格局”的因素&#xff0c;在项目正式上线前都会给早期参与者空投代币&#xff0c;以此吸引大家的关注。但是在越来越多的人加入到撸空投行列之中后&#xff0c;现在整…

javaEE 初阶 — 流量控制与拥塞控制

文章目录1. 流量控制2. 拥塞控制TCP 工作机制&#xff1a;确认应答机制 超时重传机制 连接管理机制 滑动窗口 1. 流量控制 流量控制是一种干扰发送的窗口大小的机制&#xff0c;滑动窗口&#xff0c;窗口越大&#xff0c;传输的效率就越高&#xff08;一份时间&#xff0c;…

Gromacs中的g_mmpbsa计算带电底物与蛋白的结合能不准确

g_mmpbsa计算带电底物与蛋白的结合能总是不准确 TOC 在做的两个项目中&#xff0c;利用g_mmpbsa计算带电底物与蛋白的结合能结果非常不可靠&#xff0c;底物带两个硫酸根离子&#xff0c;g_mmpbsa在计算带电的底物与酶的结合能时总是不准确&#xff0c;因此后续若底物带电&…

三层交换机DHCP中继

关于中继&#xff0c;我们需要有一个对比。正常情况下我们是不是需要配置单臂路由然后开启DHCP地址池&#xff0c;然就设置网段网关以及DNS。这样的话考验 的其实是命令功底。但是为了方便&#xff0c;我们 可以添加服务器&#xff0c;将这个服务给到服务器去配置&#xff0c;这…

为什么sleeping的会话会造成阻塞(2)

背景客户反馈系统突然从11:10开始运行非常缓慢&#xff0c;在SQL专家云中看到大量的产生阻塞的活动会话&#xff0c;KILL掉阻塞的源头马上又出现新的源头&#xff0c;实在没有办法只能重启应用程序断开所有数据库连接才解决&#xff0c;请我们协助分析根本的原因。现象登录SQL专…

Web前端CSS清除浮动的5种方法

在移动端清除浮动布局&#xff0c;常用的5种方法&#xff1a; 使用清除浮动的类&#xff1b;使用overflow属性&#xff1b;使用 flex 布局&#xff1b;使用grid 布局&#xff1b;使用 table 布局。 根据实际情况选择适合的方法&#xff0c;需要注意兼容性和语义性问题。在移动…

Yolo v5 pytorch模型转onnx用c++进行推理

本文介绍如何使用u版的yolov5 模型转成 onnx模型&#xff0c;使用python代码推理onnx模型&#xff0c;然后再使用c代码推理onnx模型,本文使用yolov5 s版本&#xff0c;在m,l,x都试过可行环境配置 :1 u版的yolov5 4.0 版本&#xff0c;其他版本没有试过 https://github.com/ultr…

console调试,chrome调试工具之Console

背景 console作为web调试的一项重要技能大多数开发人员都是console.log()一把梭到底&#xff0c;其实console对象上还有很多可用于调试的方法 控制台打印类别&#xff0c;conso调试面板 第一个是全部消息&#xff0c;第二个是自己在控制台里使用console指令打印的&#xff0…

【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢

HashMap中为什么引入红黑树&#xff0c;而不是AVL树呢1. 概述 开始学习这个知识点之前我们需要知道&#xff0c;在JDK1.8 以及之前&#xff0c;针对HashMap有什么不同。 JDK 1.7的时候&#xff0c;HashMap的底层实现是数组 链表JDK1.8的时候&#xff0c;HashMap的底层实现是数…

Web3中文|Web3再起恐慌:全球第三大稳定币BUSD发行商面临诉讼

俗话说&#xff0c;老大的位置不好当。作为全球最大加密资产交易所BA的CEO&#xff0c;赵长鹏的生活可谓一刻都不能平静。 刚刚结束与SBF的口舌之争&#xff0c;从FTX倒台的熊市中挺过来&#xff0c;赵长鹏又遇到了新的麻烦。 Nansen数据显示&#xff0c;用户在过去24小时内从…

LabVIEW开发的上位机界面在其它电脑分辨率下-界面窗口偏移显示问题解决

目录 问题&#xff1a; 分析&#xff1a; 解决方式 1&#xff09;编辑前面板边界适配对应的分辨率 2&#xff09;编辑前面板窗口-窗口边界 3&#xff09;编辑前面板窗口-保持窗口比例 4&#xff09;设置VI属性--窗口运行时位置居中显示 参考 问题&#xff1a; 在基于La…