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

简易企业网站如何做网站视频

简易企业网站,如何做网站视频,wordpress menu gif,昆明网站制作内容NIO 介绍 NIO 全称java non-blocking IO#xff08;非阻塞 I/O#xff09;#xff0c;后续提供了一系列改进的输入/输出的新特性#xff0c;被统称为 NIO(即 New IO)#xff0c;是同步非阻塞的。 阻塞和非阻塞是进程在访问数据的时候#xff0c;数据是否准备就绪的一种…NIO 介绍 NIO 全称java non-blocking IO非阻塞 I/O后续提供了一系列改进的输入/输出的新特性被统称为 NIO(即 New IO)是同步非阻塞的。 阻塞和非阻塞是进程在访问数据的时候数据是否准备就绪的一种处理方式当数据没有准备的时候。 阻塞Block往往需要等待缓冲区中的数据准备好过后才处理其他的事情否则一直等待在那里。 非阻塞Non-Block当我们的进程访问我们的数据缓冲区的时候如果数据没有准备好则直接返回不会等待。如果数据已经准备好也直接返回 同步和异步都是基于应用程序和操作系统处理 IO 事件所采用的方式 同步应用程序要直接参与 IO 读写的操作必须阻塞在某个方法上面等待我们的 IO 事件完成 异步所有的 IO 读写交给操作系统去处理应用程序只需要等待通知可以去做其他的事情并不需要去完成真正的 IO 操作当操作完成 IO 后会给我们的应用程序一个通知 特点 1.非阻塞式的I/O操作。这意味着一个线程可以同时管理多个连接而不必等待每个连接的I/O操作完成 2.通过Channel和Buffer来进行数据传输。Channel表示与实体文件、套接字等的连接而Buffer是用于在Channel和应用程序之间传输数据的缓冲区 3.提供了内存映射文件的功能可以将文件直接映射到内存中从而实现了快速的文件I/O操作 4.提供了灵活的缓冲区管理功能可以方便地进行数据的读取、写入和处理 5.采用了面向块的数据传输方式可以一次性传输大量数据提高了I/O操作的效率 运用场景 适用于连接数目多且连接比较短轻操作的架构比如聊天服务器弹幕系统服务器间通讯等 三大组件 NIO的三个最重要的核心分别为ChannelBuffer和Selector Channel(通道) 通道对原 I/O 包中的流的模拟到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象通道是双向的一个Channel既可以读数据也可以写数据 常见类型 FileChannel DatagramChannel SocketChannel ServerSocketChannel FileChannel主要用于文件传输其他三种用于网络通信。 Buffer(缓冲区) 缓冲区;实际上是一个容器对象对数组进行了封装用数组来缓存数据还定义了一些操作数组的API如 put()、get()、flip()、compact()、mark() 等。在NIO中无论读还是写数据都必须经过Buffer缓冲区. ByteBuffer MappedByteBuffer                 DirectByteBuffer                 HeapByteBuffer ShortBuffer         IntBuffer         LongBuffer         FloatBuffer         DoubleBuffer         CharBuffer其中最常用的是ByteBuffer Selector(选择器) 选择器是一个特殊的组件用于采集各个通道的状态或者事件 socket连接方法 Socket编程理解为对TCP协议的具体实现。 多线程技术 系统为每一个连接分配一个thread线程分别去处理对应的socket连接 缺点 1.内存占用高。每有一个socket连接系统就要分配一个线程去对接。当出现大量连接时会开辟大量线程导致占用大量内存。 2.线程上下文切换成本高 3.只适合连接数较少的场景 线程上下文切换         一个CPU在同一个时刻是只能处理一个线程的由于时间片耗尽或出现阻塞等情况CPU 会转去执行另外一个线程这个叫做线程上下文切换 线程池技术 使用线程池让线程池中的线程去处理连接 缺点 1.在阻塞模式下线程只能处理一个连接。线程池中的线程获取任务只有当任务完成/socket断开连接才会去获取执行下一个任务 2.只适合短链接的场景 selector技术 为每个线程配合一个选择器让选择器去管理多个channel。注FileChannel是阻塞式的因此无法使用选择器。 让选择器去管理多个工作在非阻塞式下的Channel获取Channel上的事件当一个Channel没有任务时就转而去执行别的Channel上的任务。这种适合用在连接多流量小的场景。 若事件未就绪调用 selector 的 select() 方法会阻塞线程直到 channel 发生了就绪事件。这些事件就绪后select 方法就会返回这些事件交给 thread 来处理。 ByteBuffer 简单示例 public class TestByteBuffer {public static void main(String[] arge){try{//1.输入输出流文件数据传输FileChannel channel new FileInputStream(network-program/data.txt).getChannel();//2.准备缓冲区并设置大小ByteBuffer buffer ByteBuffer.allocate(10);//3.从channel读取数据并写入buffer中channel.read(buffer);//4.buffer切换成读模式buffer.flip();//5.判断是否还有剩余未读数据while (buffer.hasRemaining()){byte b buffer.get();System.out.print((char)b);}}catch (Exception e){e.printStackTrace();}} } 使用步骤 1.向buffer写入数据如channel.read(buffer); 2.调用flip()切换至读模式 3.从buffer读取数据如buffer.get(); 4.调用clear()或compact()切换到写模式 属性 capacity缓冲区的容量不可变 limit缓冲区的界限。limit之后的数据不允许读写 position读写指针。position不可大于limit且position不为负数 mark标记。记录当前position的值。position被改变后可以通过调用reset() 方法恢复到mark的位置 常见方法 allocate方法 通过allocate我们可以给ByteBuffer分配空间但是这个空间不可以动态变换如果想要改变ByteBuffer的大小只能重新分配一个 ByteBuffer.allocate(10); allocateDirect方法 通过allocateDirect我们也可以给ByteBuffer分配空间 ByteBuffer.allocateDirect(10); allocate 与 allocateDirect的区别: 1.allocate创建出来的是HeapByteBuffer对象allocateDirect创建出来的是DirectByteBuffer对象 2.HeapByteBuffer是存在于JVM的堆内存中DirectByteBuffer是存在于直接系统内存中 3.HeapByteBuffer的读写效率低于DirectByteBuffer因为HeapByteBuffer存在于jvm中的自然会收到垃圾回收器的影响 4.DirectByteBuffer使用不当容易造成内存泄露 put方法 put方法可以将数据放入到缓冲区中。操作完成后position的值会1并指向下一个可存放的区域limitcapacity buffer.put(byte b); flip方法 flip方法会切换对当前缓冲区的去操作写/读-读/写 buffer.flip(); 当是读模式切换到写模式时恢复为put时的值。  get方法 get方法会读取缓冲区里的数据一次只能读取一个。读取后position的值会1指向下一个可读区。当position大于limit时会报异常。get方法如果传入指定的索引位置get(i)。则position的值不会产生变动。 buffer.get(); clear方法 clean方法就像初始化一样会把ByteBuffer的里属性值都恢复到最初并且清除缓冲区里的数据。 buffer.clear(); compact方法 compact方法会把已经读取的数据清除后面未读取的数据向前压缩然后切换到写模式。 数据前移后原始位置的数据不会清楚但是在后面的写入操作中会被覆盖。 buffer.compact(); rewind方法 rewind方法只能在读模式下使用使用后会恢复position、limit和capacity的值 buffer.rewind(); mark方法和reset方法 这个两个方法通常都是搭配着使用。 mark做一个标记会保存当前position的值reset方法会把mark保存的值重新赋给position。 buffer.mark(); buffer.reset(); 字符串与ByteBuffer的相互转换 方法一 // 编码字符串的getByte方法ByteBuffer buffer ByteBuffer.allocate(15);buffer.put(str.getBytes()); 方法二 // 编码StandardCharsets的encode方法获取ByteBufferByteBuffer buffer2 StandardCharsets.UTF_8.encode(str); 方法三 ByteBuffer buffer3 ByteBuffer.wrap(str.getBytes());// 解码 通过StandardCharsets的decoder方法解码String decodeStr3 StandardCharsets.UTF_8.decode(buffer3).toString();黏包和半包 黏包发送方在发送数据时并不是一条一条地发送数据而是将数据整合在一起当数据达到一定的数量后再一起发送。这就会导致多条信息被放在一个缓冲区中被一起发送出去。 半包因为我们分配缓冲区的大小是固定如果空间小于数据量那就只能先把当前缓冲区里的数据读取完再去接收剩下的的数据。数据就会出现被截断的断层现象。 如 Hello world!\n I’m LIKEGAKKI!\n How are you?\n 经过传输后服务端的产生了两个ByteBuffer: Hello,world\nI’m LIKEGAKKI\nHo黏包 w are you?\n半包 重新拆分 public class TestByteBufferExam {public static void main(String[] args){ByteBuffer buffer ByteBuffer.allocate(32);buffer.put(Hello,world\nI,m zhangsan\nHo.getBytes());split(buffer);buffer.put(w are you?\n.getBytes());split(buffer);}private static void split(ByteBuffer buffer){buffer.flip();for(int i 0;ibuffer.limit();i){if(buffer.get(i) \n){int length i 1 - buffer.position();ByteBuffer byteBuffer ByteBuffer.allocate(length);for(int j 0;jlength;j){byteBuffer.put(buffer.get());}System.out.println(byteBuffer.get());}}buffer.compact();} 在循环中用get(i)方法依次读取数据当读取的数据匹配‘\n’时说明之前的读取的是一段信息。 记录该段数据长度以便于申请对应大小的缓冲区将缓冲区的数据通过get()方法写入到target中。 调用compact方法切换模式因为缓冲区中可能还有未读的数据。
http://www.pierceye.com/news/653278/

相关文章:

  • 做平面的网站wordpress授权主题
  • 如何做织梦论坛类的网站官网建设目的
  • 安徽网新科技有限公司 网站开发静态网页报告
  • 营销做网站公司怎么做国际货运代理外贸网站
  • 网站建设部署与发布有效期宝石网站建设
  • 网站建设有什么需求分析现在网站都是拿什么软件做的
  • 网站建设需求分析报告撰写阿里云建设网站流程
  • 网站导航栏设计要求seo搜索引擎的优化
  • 杭州做商务网站全屋定制自己设计
  • 汉中定制网站建设公司南昌公司注册
  • 商务网站建设流程步骤小型公司注册资金写多少合适
  • 台州公司网站外包自己做网站运营
  • 聚名网站专业团队p图
  • 网站推广排名收费徐家汇网站建设
  • 做app软件大概多少钱宁波seo优化项目
  • 网站建设土豆视频教程最专业微网站首选公司
  • 合肥做检查军大网站家装公司名称
  • 网站搜索怎么做的苏州网站建设介绍
  • 免费微网站建设地图标注收费属于违法行为吗
  • 网站开发工程师php岗位职责企业网站案例展示
  • 青岛网站营销推广网站工作室设计
  • 网站可以增加关键词吗做网站也是一门技术
  • 长沙 外贸网站建设公司排名传统文化传播公司网站建设
  • 站群seo技巧1 企业网站的一般内容是什么
  • 广东省城乡建设厅投诉网站首页wordpress posts
  • 泰安建设厅网站怎样给公司做一个网站
  • 扶贫网站开发的目的是什么2023年舆情分析报告
  • 河南建设银行处理违章网站网站做支付需要准备什么东西吗
  • 网站设置不能通过链接访问比较好的源码网站
  • 深圳做网站联雅空间业务建设网站