当前位置: 首页 > news >正文

netty

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() {@Overridepublic 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 <= capacityprivate 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个intIntBuffer 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运行效果:

相关文章:

netty

Netty的介绍Netty是异步的&#xff08;指定回调处理&#xff09;、基于事件驱动的网络应用框架&#xff0c;用于快速开发高性能、高可靠性的网络IO程序。Netty本质是一个NIO框架&#xff0c;适用于服务器通讯相关的多种应用场景&#xff0c;分布式节点远程调用中Netty往往作为R…...

Django项目部署-uWSGI

Django项目部署-uWSGIDjango运维部署框架整体部署架构web服务器与web应用服务器的区别部署环境准备安装python3安装mariadb安装Django和相关模块Django托管服务器uWSGI使用uWSGI配置使用Django运维部署框架 整体部署架构 操作系统: Linux 。优势&#xff1a;生态系统丰富&…...

jhipster自动生成java代码的方法

一、前言 java springboot后台项目用到了jpa查询数据库&#xff0c;还用到了jhipster&#xff0c;这个东西可以自动生成基础的Controller、Service、Dao、JavaBean等相关代码&#xff0c;减少重复开发。 在此总结下使用方法。 二、jhipster自动生成java代码的方法 1.需要先…...

LeetCode 82. 删除排序链表中的重复元素 II

原题链接 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给定一个已排序的链表的头 headheadhead &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,…...

tensorflow gpu环境安装

查看本电脑支持的最高cuda版本&#xff1a;nvidia-smi在~/.condarc修改conda 源&#xff1a;channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/- https://mirrors.tuna.tsinghua.edu.cn/…...

如何在现实场景中随心放置AR虚拟对象?

随着AR的发展和电子设备的普及&#xff0c;人们在生活中使用AR技术的门槛降低&#xff0c;比如对于不方便测量的物体使用AR测量&#xff0c;方便又准确&#xff1b;遇到陌生的路段使用AR导航&#xff0c;清楚又便捷&#xff1b;网购时拿不准的物品使用AR购物&#xff0c;体验更…...

操作系统-处理机调度

1.处理机调度的概念、层次1.1调度的基本概念制定某种规则来决定处理任务的顺序。1.2调度的三个层次高级调度&#xff08;作业调度&#xff09;中级调度&#xff08;内存调度&#xff09;进程的挂起态与七状态模型低级调度&#xff08;进程调度&#xff09;小结2.进程调度的时机…...

手机截图如何提取文字?

在当今信息爆炸的时代&#xff0c;图文并茂已经成为了一个广告宣传的常用方式。然而&#xff0c;图片中的文字信息往往难以获取&#xff0c;尤其对于那些需要快速获取信息的人们来说&#xff0c;阅读图片中的文字会是一项繁琐且费时的任务。现在&#xff0c;我们有一个好消息要…...

vue中复制内容

vue中复制内容vue2vue-clipboard2依赖项在main.js引入使用vue3vue-clipboard3依赖项引入使用更新于&#xff1a;2023-02-15vue2vue-clipboard2 依赖项 “vue”: “^2.6.11” “vue-clipboard2”: “^0.3.1” 在main.js引入 import VueClipboard from vue-clipboard2 Vue.us…...

MySQL CAST()函数用法

一、语法 expr&#xff1a;源数据&#xff0c;如字符串’China’。type&#xff1a;目标数据类型&#xff0c;例如CHAR。 cast(expr AS type)二、命令说明 将任何类型的值转换为具有指定类型的值。 CAST()函数通常用于返回具有指定类型的值&#xff0c;以便在WHERE&#xff…...

【测试工程师面试】详细记录 自己的一次面试

【测试工程师面试】详细记录 自己的一次面试 目录&#xff1a;导读 Linux基础 Oracle基础 编程基础 测试的基础 面试的问题 扯闲话部分&#xff1a; 10点刚到&#xff0c;先进行笔试&#xff0c;笔试的题目很基础&#xff0c;涉及到linux&#xff0c;涉及到oracle数据库…...

Elasticsearch 安装(二)

目录前言一、Linux 安装1、下载安装包⑴、选择需要的安装包⑵、下载解压到安装目录2、查看解压后目录结构3、启动 Elasticsearch⑴、正常启动流程⑵、启动过程遇到的问题①、启动报错②、创建运行 Elasticsearch 的用户&#xff0c;启动成功&#xff0c;但无法访问③、停止Elas…...

Java基础:异常与错误(ExceptionError)

1 缘起 某天上网冲浪时&#xff0c;偶然看到一个问题&#xff0c;说Java的Error和Exception有什么区别&#xff1f; 一句话&#xff1a;不知道。并不能很清晰地描述出个中区别。 当然&#xff0c;曾经也看过Throwable相关的知识&#xff0c;但是&#xff0c;并没有通过源码及注…...

VAmPI:一个包含了OWASP Top10漏洞的REST API安全学习平台

关于VAmPI VAmPI是一个包含了OWASP Top10漏洞的REST API安全学习平台&#xff0c;该平台基于Flask开发&#xff0c;该工具的主要目的是通过一个易受攻击的API来评估针对API安全检测工具的有效性&#xff0c;并帮助广大研究人员学习和了解API安全。 功能介绍 1、基于OWASP Top…...

springboot(6)之前端传递参数的方式 普通 集合 数组

实体类传递 首先我们在后端定义一个实体类&#xff0c;通过lombok插件重写 有参 无参 get set toString 方法, 然后前端发送数据&#xff0c;后端就会自动收到&#xff0c;然后属性填写 后端代码如下 AllArgsConstructor Data NoArgsConstructor public class role …...

redis分布式锁的演变过程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、直接添加Redis缓存二、使用setnx执行抢锁过程三、setnx获取锁+设置过期时间四、引入UUID解决误删锁问题五、引入Lua脚本来做删除六、对递归部分优化进行自旋七、添加自旋次数八、改为重入锁,使…...

leaflet 修改popup的样式,个性化弹窗(069)

第069个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中修改popup组件的样式,个性化弹窗。主要方法是更改css, 中增加custom-popup类名,style的样式要做穿透处理 >>>.具体方法请参考源代码。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实…...

注解ConfigurationProperties、EnableConfigurationProperties的用法

1 ConfigurationProperties ConfigurationProperties主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 &#xff0c;通过指定的前缀&#xff0c;来绑定配置文件中的配置。这样的好处是将配置数据与JOPO进行转换&#xff0c;能够管理一个类别的所有配置信息&…...

自适应布局之淘宝无限适配+rem+微信rpx自适应

一、自适应布局 所谓前端适配&#xff0c;就是为了让移动设计稿在大部分的移动设备上看起来有一致的展示效果&#xff0c;目前比较流行的方法有两种。一种是强制meta viewport宽度为设计稿宽度&#xff0c;一种是使用rem自适应布局的flexible.js。 二、当前流行的移动端自适应…...

esxi不能识别不兼容网卡解决方案

相信很多网友在安装测试VMWARE Esxi 6.0的时候&#xff0c;总会遇到无法兼容网卡的情况&#xff0c;本人也是遇到了再组装的台式机上测试ESXI 6.0的时候&#xff0c;无法识别REALTEK RTL 8111E的情况。 找了很多网友提供的博客&#xff0c;方法是正确的&#xff0c;但是不够严…...

Sizeof与Strlen的区别与联系

16年写了很多 C 与 C 相关的文章&#xff0c;但是后面从事了 Android 开发&#xff0c;就全部删掉了&#xff0c;无意中发现了这篇由还存在草稿箱&#xff0c;索性就找回来吧&#xff0c;也是追忆当年学习的青葱岁月 Sizeof与Strlen的区别与联系 一、sizeof sizeof(…)是运算…...

力扣(LeetCode)413. 等差数列划分(2023.02.15)

如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0c;[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums &#xff0c;返回数组 nums 中所有为等差数组的 子数组 个数。 …...

蓝桥杯刷题——基础篇(一)

这部分题目&#xff0c;主要面向有志参加ACM与蓝桥杯竞赛的同学而准备的&#xff0c;蓝桥杯与ACM考察内容甚至评测标准基本都一样&#xff0c;因此本训练计划提供完整的刷题顺序&#xff0c;循序渐进&#xff0c;提高代码量&#xff0c;巩固基础。因竞赛支持C语言、C、Java甚至…...

Java基础知识快速盘点(三)

一&#xff0c;构造器 创建一个类的方法时会调用该类的构造器 构造器&#xff0c;也叫构造方法 构造器是属于类的&#xff0c;对象不可调用 构造方法没有返回值类型 构造方法一般用public修饰&#xff0c;也可用private修饰&#xff0c;例如 public class Test {private T…...

vscode编程小插件之Doxygen和Better Align

一、插件Doxygen:配置相应文件、函数说明项。 1、扩展商店&#xff0c;搜索Doxygen&#xff0c;如下图1&#xff0c;安装。 图1 2、设置项中&#xff0c;选择扩展设置&#xff0c;如图2 图2 3、配置版本、作者邮箱、作者名称、日期格式等等&#xff0c;如图3 4、定义函数后&…...

指 针

1.指针指针的作用: 可以通过指针间接访问内存&#xff08;可以通过指针的保存一个地址&#xff08;指针--地址&#xff09;&#xff09;内存编号是从0开始记录的&#xff0c;一般用十六进制数字表示。可以利用指针变量保存地址指针变量的定义和使用指针变是定义语法: 数据类型 …...

安卓小游戏:俄罗斯方块

安卓小游戏&#xff1a;俄罗斯方块 前言 最近用安卓自定义view写了下飞机大战、贪吃蛇、小板弹球三个游戏&#xff0c;还是比较简单的&#xff0c;这几天又把俄罗斯方块还原了一下&#xff0c;写了一天&#xff0c;又摸鱼调试了两天&#xff0c;逻辑不是很难&#xff0c;但是…...

NC113 验证IP地址

验证IP地址_牛客题霸_牛客网 描述 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址 IPv4 地址由十进制数和点来表示&#xff0c;每个地址包含4个十进制数&#xff0c;其范围为 0 - 255&#xff0c; 用(".")分割。比如&#xff0c;172.16.254.1&#…...

珠宝企业如何利用私域实现业绩增长?

近年来私域的流量不断兴起&#xff0c;各行业都在做私域&#xff0c;所处行业不同&#xff0c;企业所采取的私域打法也会针对性地改变。而在珠宝行业&#xff0c;针对珠宝产品高价、低频的消费特点&#xff0c;企业又该如何搭建私域应对策略&#xff1f; 快鲸scrm系统整理了几…...

回收站清空了还能找回来吗?回收站恢复的4个方法(最全)

回收站作为一个数据回收的地方&#xff0c;可以保存已删除的文件很久&#xff0c;直到用户手动永久删除这些数据&#xff0c;这为用户避免了许多数据丢失的问题。但是回收站数据过多&#xff0c;难免会影响电脑的运行速度。为此&#xff0c;我们都会定期进行清理。 清理过程中…...

做视频网站把视频放在哪里/百度推广费用预算表

重新装一下看看喽!第一步:将打印机连接至主机&#xff0c;打开打印机电源&#xff0c;通过主机的“控制面板”进入到“打印机和传真”文件夹&#xff0c;在空白处单击鼠标右键&#xff0c;选择“添加打印机”命令&#xff0c;打开添加打印机向导窗口。选择“连接到此计算机的本…...

公司的网站推广怎么做/网站优化及推广方案

Android Camera Develop: process preview frames in real time efficiently概述本篇我们暂时不介绍像相机APP增加新功能&#xff0c;而是介绍如何处理相机预览帧数据。想必大多数人都对处理预览帧没有需求&#xff0c;因为相机只需要拿来拍照和录像就好了&#xff0c;实际上本…...

湖南长沙网站建设/山东潍坊疫情最新消息

构建高性能的web站点需要考虑很多方面&#xff0c;我们在这了解一下其中一项---------数据库扩展&#xff0c;希望能够让没有接触过这方面知识的朋友对数据库扩展有个认识吧。 随着用户数量的不断增加&#xff0c;数据库将面临着巨大的增删改查&#xff0c;即便我们将sql语句优…...

中国建设银行安徽分行网站/线上营销方式

本文将对rocktmq-spring-boot的设计实现做一个简单的介绍&#xff0c;读者可以通过本文了解将RocketMQ Client端集成为spring-boot-starter框架的开发细节&#xff0c;然后通过一个简单的示例来一步一步的讲解如何使用这个spring-boot-starter工具包来配置&#xff0c;发送和消…...

建设个读书网站大约需要投入多少钱/dy刷粉网站推广马上刷

上一篇中分析了Scala版的console producer代码&#xff0c;这篇文章为读者带来一篇console consumer工作原理分析的随笔。其实不论是哪个consumer&#xff0c;大部分的工作原理都是类似的。本文利用console consumer作为切入点&#xff0c;既容易理解又不失一般性。本文使用的K…...

wordpress 父级 模板/百度推广业务电话

scala :::在过去的一年左右的时间里&#xff0c;Scala编程语言取得了空前的增长&#xff0c;成功地从专业的JVM语言转变为可行的Java替代方案&#xff0c;企业至少应该关注一下。 尽管在Twitter&#xff0c;The Guardian和LinkedIn的生产环境中&#xff0c;它尚未进入主流。 但…...