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

做模版网站需要租服务器吗企业网站推广的方法有什么

做模版网站需要租服务器吗,企业网站推广的方法有什么,小程序制作样式,一个公司做网站需要注意什么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/988393/

相关文章:

  • 网站淘客宝怎么做建网站自己与租云服务器哪个好
  • 网站建设方案书泰安网红金火火
  • 常用网站建设技术有哪些网站建设策划书提纲
  • 邯郸网站建设纵横重庆永川网站建设公司
  • 万州网站制作网站定制开发注意事项
  • 网站专题优化聊城手机网站建设软件
  • 网站上的百度地图标注咋样做怎么更改wordpress
  • php网站开发心得3500字室内设计联盟邀请码
  • 厦门加盟网站建设购物网站图片的放大怎么做的
  • html网站设计模板如何查询网站后台地址
  • 东莞网站优化是什么河南省精品旅游线路发布
  • 大学生心理咨询网站建设论文做新闻类网站还有市场吗
  • 设计素材网站推荐2023天津在线网页制作报价
  • 建站极速通百度热词搜索指数
  • 官方网站建设公司排名百度关键词优化首选667seo
  • 兰州网站建设招聘建设网站的基本流程是什么
  • 定边网站建设福州网站关键排名
  • 重庆公司网站建设北排建设公司官网
  • 临沂做网站选盛誉公司微网站制作
  • 淘宝上面如何做网站凡科网的网站建设好用吗
  • 东莞做网站排名优化推广wordpress 创建文章
  • 自己可以做网站服务器吗社交网站页面设计
  • 安阳信息港网站阳江网红打卡点
  • 天津公司建设网站七台河哈尔滨网站建设
  • 本地电脑如何做网站服务器网站建设全部流程包括备案
  • 想要做个公司网站整站采集wordpress
  • 新网站做外链谢馥春网站建设的优势
  • 昆明网站运营公司有哪些网站建设前的市场分析怎么写
  • 公司宣传片广告网站优化外链
  • 宁波网站优化公司哪家好网站推广主要用的软件