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

做装修的业务网站网站建设优化哪家公司好

做装修的业务网站,网站建设优化哪家公司好,优化方案英语必修三电子版,wordpress 选择语言NIO Java NIO 三大核心组件 Buffer(缓冲区):每个客户端连接都会对应一个Buffer,读写数据通过缓冲区读写。Channel(通道):每个channel用于连接Buffer和Selector,通道可以进行双向读…

NIO

Java NIO 三大核心组件

  1. Buffer(缓冲区):每个客户端连接都会对应一个Buffer,读写数据通过缓冲区读写。
  2. Channel(通道):每个channel用于连接Buffer和Selector,通道可以进行双向读写。
  3. Selector(选择器):一个选择器对应多个通道,用于监听多个通道的事件。Selector可以监听所有的channel是否有数据要读取,当某个channel有数据时,就去处理,所有channel都没有数据时,线程可以去执行其他任务。

image-20210916114642170

使用 NIO 模型操作 Socket 步骤:

  1. 创建 ServerSocketChannel 服务器;
  2. 创建多路复用器 Selector(每个操作系统创建出来的是不一样的 ,Windows创建的是 WindowsSelectorImpl)
  3. ServerSocketChannel 将建立连接事件注册到 Selector中(register 方法往 EPollArrayWrapper 中添加元素)
  4. 处理事件
    1. 如果是建立连接事件,则把客户端的读写请求也注册到Selector中;
    2. 如果是读写事件则按业务处理。

案例代码:

public class NioServer {public static void main(String[] args) throws IOException {// 创建服务器ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(8888));serverSocketChannel.configureBlocking(false); // 配置成非阻塞式的channel// 创建一个IO多路复用选择器Selector selector = Selector.open();// 注册serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {// 阻塞的方法,返回值代表发生事件的通道的个数// 返回值 0 超时// -1 错误// select方法可以传递超时时间,如果不传的话是timeout最后会为-1表示不会超时selector.select();// 如果不设的话客户端不操作会一直阻塞在这// 只要走到这里,必然说明,发送了事情,有可读可写可连接的channelSet<SelectionKey> selectionKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectionKeys.iterator();while (iterator.hasNext()) {SelectionKey selectionKey = iterator.next();// 这个事件处理完就删除if (selectionKey.isAcceptable()) {// 有客户端来连接了// 三次握手建立连接SocketChannel socketChannel = serverSocketChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(selector, SelectionKey.OP_READ, ByteBuffer.allocate(1024));System.out.println("某某客户端连接来啦");}if (selectionKey.isReadable()) {SocketChannel socketChannel = (SocketChannel) selectionKey.channel();ByteBuffer buffer = (ByteBuffer) selectionKey.attachment();buffer.clear();int read = socketChannel.read(buffer);if (read == -1) { // 如果是可读事件,然后又没有数据,说明是客户端与服务器端的连接断开了,// 这个时候我们关闭通道,不然选择器会一直监听通道,导致不必要的业务执行socketChannel.close();} else {System.out.println(new String(buffer.array(), 0, buffer.position()));System.out.println("有信息需要读取");}}iterator.remove();}}}
}

doSelect 方法是由 WindowsSelectorImpl 类去实现的,这是select方法最后执行的方法,因为加了互斥锁,也是为什么说这里同步阻塞的原因。
在这里插入图片描述

俩问题:

  • 当 Selector.select() 方法返回后,它会返回一组 SelectionKey 对象,这些对象代表了已经就绪的 I/O 通道,即对应的文件描述符上有事件发生。这些 SelectionKey 对象Key用来处理对应的事件。但是,如果不将已经处理过的 SelectionKey 对象从 Selector 中删除,下次调用 Selector.select() 方法时,这些已经处理过的 SelectionKey 对象扔然会被返回,导致多余的事件处理,影响性能问题。

  • 删除的话,我们可以通过 SelectionKey.cancel() 方法来实现,并且使得对应的通道(即文件描述符)不再被Selector监视。(这是有问题的,这样的话以后这个 SelectionKey 就不会再被监听了)可以在迭代器使用的时候对其进行删除。

Netty 封装好后就帮我们解决了这种问题,不会出现事件处理完后续还会一直处理的现象。

http://www.yayakq.cn/news/833999/

相关文章:

  • 建设功能网站价格建设广州公司网站
  • 网站建立需要什么技术搭建微信网站怎么做
  • 教师兼职做网站廊坊哪家公司做网站
  • ios移动网站开发创意网页设计素材模板
  • 建筑网片自动清洗机利于优化的wordpress模板
  • 泰安网站建设焦点网络做网站开发很赚钱吗
  • 国内建网站公司广告发布服务属于什么服务
  • 景区网站建设费用源码时代
  • 网站开发demo版本dw做网站导航
  • 网站建设怎么弄河北seo网站优化公司
  • 怎么建立自己的网站视频网站wap网站浏览器
  • 校园网站html模板昆明网站建设开发外包
  • 企业网站设计有哪些新功能一键seo提交收录
  • 男女做床网站网络营销简介
  • python 网站开发教程建造网站过程
  • 流量套餐汇总网站学历提升培训机构
  • 公司网站公司哪家好网站如何优化排名软件
  • 网页制作网站开发卖房网站排名
  • 有建设网站的软件吗山东省建设机械协会网站
  • 淘宝接单做网站海淀区玉泉小学网站 建设方
  • 中核工建设集团OA网站天元建设集团有限公司设计研究院
  • 网站备案没了div布局在线音乐网站设计
  • 电子商务网站建设课程设计报告做网站前
  • 陕西网站建设的目的php网站如何导入数据库
  • 建筑网站可以ai绘画吗佛山seo培训
  • 暖色调网站网站建站六个目标
  • 太原网站设计排名wordpress美化博客
  • 个人网站注册公司seo软件推荐
  • wordpress js插件开发教程视频杭州云优化信息技术有限公司
  • 国外大气的网站初中生电脑作业做网站