iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >1.netty介绍
  • 848
分享到

1.netty介绍

netty 2023-09-16 14:09:24 848人浏览 安东尼
摘要

介绍 是JBOSS通过的java开源框架是异步的,基于事件驱动(点击一个按钮调用某个函数)的网络应用框架,高性能高可靠的网络io程序基于tcp,面向客户端高并发应用/点对点大量数据持续传输的应用是

介绍

  1. 是JBOSS通过的java开源框架
  2. 是异步的,基于事件驱动(点击一个按钮调用某个函数)的网络应用框架,高性能高可靠的网络io程序
  3. 基于tcp,面向客户端高并发应用/点对点大量数据持续传输的应用
  4. 是NIO框架 (IO的一层层封装) TCP/IP->javaIO和网络编程–>NIO—>Netty

应用场景

  1. 互联网 rpc框架比如阿里的dubbo
  2. 网络游戏 可以定制TCP/UDP 和Http协议栈
  3. 大数据 hadoop序列化组件和实时数据文件共享 AVRO
    还有flink spark Akka…其他开源项目

IO模型

  1. BIO(blocking原生javaiO,阻塞性,一个连接需要一个线程处理,连接不使用阻塞也占用线程)
    //面试: 适用连接数目少架构稳定的,对服务器资源要求高,但程序简单容易理解 jdk1.4之前唯一的选择
  2. NIO(No blocking/new 同步非阻塞)(一个线程使用selector维护多个客户端,轮询检测活动 多路复用,可以开多个线程) 图1nettyNIO原理、
    请添加图片描述

//适用 连接数目多且连接比较短的(轻操作)的结果 比如聊天,弹幕,服务器之间通信,编程复杂 jdk1.4开始支持
3. AIO(等待时间长才需要异步,异步非阻塞) 是有效请求才启动线程
//面试: 适合;连接数量多且连接长的, 比如相册服务器.编程复杂,jdk7开始支持

BIO实例(可以使用线程池改善)

win的 telnet 127.0.0.1 6666端口的ctrl+]的send xxx可以发送数据到服务器

NIO

  1. 结构 如果通道没有事件,选择器不处理,线程也不阻塞 selector(选择器)<–>channel(通道)<—> buffer(缓冲区,数据先在这里实现了非阻塞)<—>Socket //IntBuffer的使用
    java除了boolean类型,是类型统一管理,所以比BIO更快 //!!!一定要flip()读写切换 才能读取值
  2. 关系
    1.buffer是内存块(面向缓冲/块的编程),是一个数组,达到一定量才给channel
    2.selector由哪个channel有事件才切换过去的,不是自动切换的 ?
    3.buffer channel是双向的,区别BIO 有in output流
    4.一个thread对应一个selector,对应多个channel

Buffer的属性

position
filp()会使他变为0,读写的时候也会改变,一直往后移
limit(块的最大容量) 和capacity(自己设置的块容量)一样用来判断是否超出范围 capacity 自己设置的数组容量 mark 标记

//常用的api

IntBuffer in=IntBuffer.allocate(5);//5个容量        .flip //读写切换,如果是读的可以切换为写的,所以说NIO是双向的      .position(1);//设置读写的位置      .limit(3);//设置读写限制个数<3      .get(); //得到元素通过iterator      .put(1);      .put(1,1);//在指定位置放数据      .clear();//清除缓冲器       .hasRemain();//相当于hasNext()      .isReadOnly();//是否为只读缓冲区      //抽象方法jdk1.6引入 hasArray()缓冲区是否可访问底层的buffer数组 array()返回buffer数组     //常用ByteBuffer

Channel 可以向buffer读写和拷贝

1.ServerSockerChannel 类似ServerSocker,SockerChannel就是Socket,还有一模一样的UDP的类2.FileChannel类  read() 通道读数据到buffer write() buffer写入通道 transferFrom()目标通道复制到本通道 transferTo() channel复制到目标通道

使用channel生成文件,与BIO的关系,底层就是BIO

          String str="aaa";         out=new FileOutputStream("d;\\aaa.txt"); //输出流包括channel          FileChannel channel=out.getChannel();            byteBuffer=ByteBuffer.allocate(1024);            byteBuffer.put(str.getBytes);            byteBuffer.flip(); //初始状态是读,切换成写            channel.write(byteBuffer);//向其他通道写            out.close();//关闭流public class bufferDemo {    public static void main(String[] args) throws IOException {        String str="helloworld";        FileOutputStream out = new FileOutputStream("D:\\abs.txt");        FileChannel channel = out.getChannel();        ByteBuffer byteBuffer=ByteBuffer.allocate(1024);        byteBuffer.position(2);        byteBuffer.put(str.getBytes()); //放在limit后面会报错,这个是限制容量        //相当于截断写入的数据        byteBuffer.limit(7);        //必须要写        byteBuffer.flip();        channel.write(byteBuffer);        channel.close();        out.close();    }}

读数据

      File file=new File("d:\\aa.txt");        in=new FileInputStream(file);         fileChannel=in.getChannel();         byteBuffer= ByteBuffer.allocate((int)file.length());         fileChannel.read(byteBuffer);              sout(new String(  byteBuffer.array()));               in.close();public class bfDemo {    public static void main(String[] args) throws IOException {        File file = new File("D:\\abs.txt");        FileInputStream inputStream = new FileInputStream(file);        FileChannel channel = inputStream.getChannel();        ByteBuffer byteBuffer = ByteBuffer.allocate((int) file.length());        channel.read(byteBuffer);            System.out.println(new java.lang.String(byteBuffer.array()));    }}

一个buffer 多个channel(创建两个流)拷贝文件 边读边写
//在java写路径相对位置是 本项目最父类的项目路径!!!(以前写相对路径总是出错)
//必须需要不然position=limit

      byteBytebuffer.clear(); .flip();     public class bfDemo3Copy {    public static void main(String[] args) throws IOException {        FileInputStream inputStream = new FileInputStream("D:\\abs.txt");        FileChannel c1 = inputStream.getChannel();        FileOutputStream fileOutputStream = new FileOutputStream("D:\\abs1.txt");        FileChannel c2 = fileOutputStream.getChannel();        ByteBuffer allocate = ByteBuffer.allocate(inputStream.available());        c1.read(allocate);        allocate.flip();        c2.write(allocate);    }}

//一块一块读,反转写入.steps are combinate bytes to buffer and send to another channel(outputStream)

public class NIOFileChannel03 {    public static void main(String[] args) throws Exception {        FileInputStream fileInputStream = new FileInputStream("1.txt");        FileChannel fileChannel01 = fileInputStream.getChannel();        FileOutputStream fileOutputStream = new FileOutputStream("2.txt");        FileChannel fileChannel02 = fileOutputStream.getChannel();        ByteBuffer byteBuffer = ByteBuffer.allocate(512);        while (true) { //循环读取            byteBuffer.clear(); //清空buffer!!!            int read = fileChannel01.read(byteBuffer);            System.out.println("read =" + read);            if(read == -1) { //表示读完                break;            }            //将buffer 中的数据写入到 fileChannel02 -- 2.txt            byteBuffer.flip();            fileChannel02.write(byteBuffer);        }        //关闭相关的流        fileInputStream.close();        fileOutputStream.close();    }}

拷贝图片

     destch.transferFrom(sourceCh,0,sourceCh.size());    //关闭所有通道和流public class bfDemo4transferCopy {    public static void main(String[] args) throws IOException {        FileInputStream inputStream = new FileInputStream("D:\\abs.txt");        FileChannel c1 = inputStream.getChannel();        FileOutputStream fileOutputStream = new FileOutputStream("D:\\abs3.txt");        FileChannel c2 = fileOutputStream.getChannel();        c2.transferFrom(c1,0,c1.size());    }}

buffer放的顺序和取的顺序一样不然抛出异常BufferUnderflowException

  ByteBuffer bf= ByteBuffer.allocate(64);     bf.putInt(100);      bf.putLong(100L);    bf.flip();   bf.getInt();      bf.getLong();

写完转为只读buffer
//12的代码

    buffer.asReadOnlyBuffer();public class OnlyWrite {    public static void main(String[] args) {        ByteBuffer bf= ByteBuffer.allocate(64);        bf.putInt(100);        bf.putLong(100L);        bf.flip();        ByteBuffer byteBuffer = bf.asReadOnlyBuffer();        byteBuffer.getInt();        byteBuffer.getLong();        byteBuffer.putLong(10);//错误不能写,只能读    }}

MappedByteBuffer可以在堆外内存修改文件(效率高)操作系统不用拷贝一次到内存

access=new RandAccessFile("1.txt","rw"); channel=access.getChannel();map=channel.map(FileChannel.MapMode.READ_WRITE,0,5);模式,开始位置,结束位置 <5byte   map.put(0,(byte)'H'); //在内存直接修改文件内容,然后放回磁盘  access.close();
 public class MapBuffer {    public static void main(String[] args) throws IOException {        RandoMaccessFile access = new RandomAccessFile("1.txt", "rw");        FileChannel channel = access.getChannel();        //到内存修改的大小范围是 0-5, if out of the bound will throw an expection        MappedByteBuffer map = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);        map.put(0,(byte)'A');        map.put(4,(byte)'H');        access.close();        System.out.println("修改成功");    }}

//idea需要在文件夹外打开,不然看不到效果

分散和聚集 scatter(写的时候放到多个buffer[数组array])和gather(读的时候多个buffer) 加快读写效率(the key is using many buffer to read and read)(read and write only once that can get more buffer)

  public class scatterAndGather {    public static void main(String[] args) throws IOException {        ServerSocketChannel serverSocket =  ServerSocketChannel.open().bind(new InetSocketAddress(6666));        ByteBuffer[] byteBuffers= new ByteBuffer[2];        byteBuffers[0]=ByteBuffer.allocate(3);        byteBuffers[1]=ByteBuffer.allocate(5);        SocketChannel accept = serverSocket.accept();        int msgLen=8;       while (true){           int byteRead=0;          while (byteRead<msgLen){              long read = accept.read(byteBuffers);              byteRead++;              System.out.println("bufferRead:"+byteRead);              Arrays.asList(byteBuffers).stream()                      .map(  buffer->"position"+buffer.position()+          ",limit="+buffer.limit()                      )  .forEach(System.out::println);          }           Arrays.asList(byteBuffers).stream().forEach(buffer ->buffer.flip() );          long byteWrite=0;          while (byteWrite<msgLen){              //一次读出多少个字节              long l=accept.write(byteBuffers);              byteWrite+=l;              System.out.println(byteWrite);          }          Arrays.asList(byteBuffers).forEach(byteBuffer -> {              System.out.println(new String(byteBuffer.array() ));              byteBuffer.clear();});           System.out.println("byteRead:="+byteRead+"byteWrite:"+byteWrite+"msgLen:"+msgLen);       }    }}

selector管理多个连接(channel) 不停如轮询检测事件,有事件处理,阻塞不等待,处理其他通道的请求,解决了多线程单通道的问题,提高了性能

   selector类selects()//得到channel的连接的selecTKEy集合阻塞,  selector.select(1000)//阻塞1000毫秒,必须返回数据  selector.wakeup()//唤醒selector,阻塞中可以唤醒  selector.selectNow()//非阻塞,立即返回结果,核心方法           selector.selectedKeys() //select获取绑定channel产生事件的selectkey集合//可以注册channel到selector上返回selectionKey  (集合)

来源地址:https://blog.csdn.net/weixin_47039303/article/details/132007571

您可能感兴趣的文档:

--结束END--

本文标题: 1.netty介绍

本文链接: https://www.lsjlt.com/news/409957.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 1.netty介绍
    介绍 是JBOSS通过的java开源框架是异步的,基于事件驱动(点击一个按钮调用某个函数)的网络应用框架,高性能高可靠的网络IO程序基于TCP,面向客户端高并发应用/点对点大量数据持续传输的应用是...
    99+
    2023-09-16
    netty
  • 1. 介绍
    在本教程中,我们将学习如何在亚马逊 AWS 上搭建 Linux 服务器。AWS 是一家全球领先的云计算服务提供商,提供了各种各样的云计算服务,包括虚拟机、存储、数据库、网络等等。AWS 的 EC2 服务是一种弹性计算云服务,可以轻松地创建和...
    99+
    2023-10-27
  • 1.RabbitMQ介绍
    一、MQ是什么?为什么使用它 MQ(Message Queue,简称MQ)被称为消息队列。 是一种用于在应用程序之间传递消息的通信方式。它是一种异步通信模式,允许不同的应用程序、服务或组件之间通过将消息放入队列中来进行通信。这些消息可以包含...
    99+
    2023-08-30
    rabbitmq 分布式
  • 对Netty组件的基本介绍
    Netty的介绍 netty是一个异步的基于事件的框架,主要针对在tcp协议下,开发面向clients端的高...
    99+
    2022-11-12
  • Python【1】:python介绍,历
    Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。Python是纯粹的自由软件,...
    99+
    2023-01-31
    Python python
  • 1.AutoMapper简单介绍
    官网:http://automapper.org/ 源码:https://github.com/AutoMapper/AutoMapper NUGET安装: PM> Install-Package AutoMapper Au...
    99+
    2020-08-26
    1.AutoMapper简单介绍
  • django-1-框架介绍
    <<<python虚拟环境>>> 用django框架做web开发必须要用到python虚拟环境,而且一个虚拟环境只能创建一个django项目,如果创建多个django项目的画将会出现一些莫名奇妙的异常 ...
    99+
    2023-01-30
    框架 django
  • python模块介绍- socket(1
    底层的socket库可以直接访问本地Csocket库并且可与任何网络服务通信。select同时监控多个sockets,支持网络服务和多个客户端通信。 SocketServer框架抽象了很多创建网络服务器的重复工作。该类来可以使用f...
    99+
    2023-01-31
    模块 python socket
  • Python基础语法介绍(1)
    环境配置 开发平台:Mac OS Version 10.13.2 开发工具安装 Python3.6.5 官网安装网址:https://www.python.org/downloads/ Pycharm 官网安装网址:http://w...
    99+
    2023-01-31
    语法 基础 Python
  • python 第一章 介绍-1.pyth
    一.Python特点         开源免费         脚本语言,解析执行         跨平台        高级语言,面向对象,可扩展,可移植性用于在不同的平台(因为Python是用C写的,又由于C的可移植性)内存管理器在Py...
    99+
    2023-01-31
    python pyth
  • 分布式Netty源码分析EventLoopGroup及介绍
    目录EventLoopGroup介绍功能1:先来看看注册Channel功能2:执行一些Runnable任务EventLoop介绍NioEventLoop介绍EpollEventLoo...
    99+
    2022-11-13
  • java中a=a+1和a+=1的区别介绍
    目录java a=a+1和a+=1的区别测试用例调用的方法Java趣事a=a++和a=++a整个过程大致就是这样,来一幅图解释吧java a=a+1和a+=1的区别 测试用例调用的...
    99+
    2022-11-12
  • 1. LAMP架构介绍MySQL安装
    [toc] LAMP架构介绍MySQL安装 一、 LAMP架构介绍 1.Linux+Apache(httpd)+MySQL+PHP Appache是最常用的web服务软件,而MYSQL是比较小型的数据库软件...
    99+
    2022-10-18
  • python学习笔记(开课介绍1)
    讲师简介:Alex Li(金角大王)crazyeye堡垒机、madking资产管理、TriAquae主机管理开源软件作者。老男孩教育python教学总监,51cto 2016十大最受学员喜欢讲师之一就职经历:略其中中金公司、诺基亚公司的介绍...
    99+
    2023-01-31
    学习笔记 python
  • 1-----python编程语言介绍和安
    官网:https://www.python.org/1,编程语言的种类:(1) 汇编语言(2) 机器语言(3) 脚本语言(4) 高级语言2,机器语言--->汇编语言--->C语言--->Java ,C#,PHP,Pytho...
    99+
    2023-01-31
    编程语言 python
  • Python 入门基础1 --语言介绍
    本节目录: 一、编程语言介绍 二、python解释器介绍 三、安装python解释器 四.运行python程序的两种方式 五、变量 六、后期补充内容 一、编程语言介绍   1.机器语言:     直接用二进制编...
    99+
    2023-01-30
    入门 语言 基础
  • Netty | 第1章 Java NIO 网络编程《Netty In Action》
    目录前言1. Java 网络编程1.1 Javs NIO 基本介绍1.2 缓冲区 Buffer1.2 通道 Channel1.3 选择器 Selector1.4 NIO 非阻塞网络编程原理分析2. 线程模型概述2.1 传统阻塞 IO 服务...
    99+
    2015-03-26
    Netty | 第1章 Java NIO 网络编程《Netty In Action》
  • Android单元测试框架Robolectric3.0介绍(1)
      一、关于Robolectric3.0   作为一个软件开发攻城狮,无论你多不屑多排斥单元测试,它都是一种非常好的开发方式,且不谈TDD,为自己写的代码负责,测试自己写...
    99+
    2022-06-06
    android单元测试 测试 Android
  • Mysql入门基础(1)-->基本介绍
    第一章      数据库概述          &nbs...
    99+
    2022-10-18
  • linux用户与文件基础命令介绍(1)
    linux系统是一个多用户多任务的分时操作系统,但系统并不能识别人,它通过账号来区别每个用户。每个linux系统在安装的过程中都要为root账号设置密码,这个root即为系统的第一个账号。每一个用这个账号登...
    99+
    2022-06-04
    命令 文件 基础
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作