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

网站seo怎么优化wordpress大前端logo

网站seo怎么优化,wordpress大前端logo,平台公司是什么意思,建设 网站协议文章目录 Pre概述异步 I/OSelectors打开一个 ServerSocketChannel选择键内部循环监听新连接接受新的连接删除处理过的 SelectionKey传入的 I/O回到主循环 Pre 庖丁解牛#xff1a;NIO核心概念与机制详解 01 庖丁解牛#xff1a;NIO核心概念与机制详解 02 _ 缓冲区的细节实现… 文章目录 Pre概述异步 I/OSelectors打开一个 ServerSocketChannel选择键内部循环监听新连接接受新的连接删除处理过的 SelectionKey传入的 I/O回到主循环 Pre 庖丁解牛NIO核心概念与机制详解 01 庖丁解牛NIO核心概念与机制详解 02 _ 缓冲区的细节实现 庖丁解牛NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片 庖丁解牛NIO核心概念与机制详解 04 _ 分散和聚集 庖丁解牛NIO核心概念与机制详解 05 _ 文件锁定 概述 在 Java NIO 中连网操作与其他操作一样依赖于通道Channel和缓冲区Buffer。通道是用于读取和写入数据的途径而缓冲区则用于暂存数据。 与传统的同步 I/O 不同Java NIO 中的通道操作是非阻塞的这意味着在发起 IO 请求后进程可以继续执行其他任务而不需要等待 IO 操作完成。当 IO 操作完成后进程会收到通知此时再进行相应的处理。 异步 I/O 异步 I/O 是一种 没有阻塞地 读写数据的方法。通常在代码进行 read() 调用时代码会阻塞直至有可供读取的数据。同样 write() 调用将会阻塞直至数据能够写入。 另一方面异步 I/O 调用不会阻塞。相反你将注册对特定 I/O 事件的兴趣 ― 可读的数据的到达、新的套接字连接等等而在发生这样的事件时系统将会告诉你。 异步 I/O 的一个优势在于它允许你同时根据大量的输入和输出执行 I/O。同步程序常常要求助于轮询或者创建许许多多的线程以处理大量的连接。使用异步 I/O你可以监听任何数量的通道上的事件不用轮询也不用额外的线程。 来看个Demo 这个程序就像传统的 echo server它接受网络连接并向它们回响它们可能发送的数据。不过它有一个附加的特性就是它能同时监听多个端口并处理来自所有这些端口的连接。并且它只在单个线程中完成所有这些工作。 import java.io.*; import java.net.*; import java.nio.*; import java.nio.channels.*; import java.util.*;/*** author 小工匠* version 1.0* mark: show me the code , change the world*/ public class MultiPortEcho {private int ports[];private ByteBuffer echoBuffer ByteBuffer.allocate(1024);public MultiPortEcho(int ports[]) throws IOException {this.ports ports;go();}private void go() throws IOException {// Create a new selectorSelector selector Selector.open();// Open a listener on each port, and register each one// with the selectorfor (int i 0; i ports.length; i) {ServerSocketChannel ssc ServerSocketChannel.open();ssc.configureBlocking(false);ServerSocket ss ssc.socket();InetSocketAddress address new InetSocketAddress(ports[i]);ss.bind(address);SelectionKey key ssc.register(selector, SelectionKey.OP_ACCEPT);System.out.println(Going to listen on ports[i]);}while (true) {int num selector.select();Set selectedKeys selector.selectedKeys();Iterator it selectedKeys.iterator();while (it.hasNext()) {SelectionKey key (SelectionKey) it.next();if ((key.readyOps() SelectionKey.OP_ACCEPT) SelectionKey.OP_ACCEPT) {// Accept the new connectionServerSocketChannel ssc (ServerSocketChannel) key.channel();SocketChannel sc ssc.accept();sc.configureBlocking(false);// Add the new connection to the selectorSelectionKey newKey sc.register(selector, SelectionKey.OP_READ);it.remove();System.out.println(Got connection from sc);} else if ((key.readyOps() SelectionKey.OP_READ) SelectionKey.OP_READ) {// Read the dataSocketChannel sc (SocketChannel) key.channel();// Echo dataint bytesEchoed 0;while (true) {echoBuffer.clear();int r sc.read(echoBuffer);if (r 0) {break;}echoBuffer.flip();sc.write(echoBuffer);bytesEchoed r;}System.out.println(Echoed bytesEchoed from sc);it.remove();}}//System.out.println( going to clear ); // selectedKeys.clear(); //System.out.println( cleared );}}public static void main(String args[]) throws Exception {if (args.length 0) {System.err.println(Usage: java MultiPortEcho port [port port ...]);System.exit(1);}int ports[] new int[args.length];for (int i 0; i args.length; i) {ports[i] Integer.parseInt(args[i]);}new MultiPortEcho(ports);} }Selectors 我们来基于 MultiPortEcho 的源代码中的 go() 方法的实现因此应该看一下源代码以便对所发生的事情有个更全面的了解。 异步 I/O 中的核心对象名为 Selector。Selector 就是你注册对各种 I/O 事件的兴趣的地方而且当那些事件发生时就是这个对象告诉你所发生的事件。 所以我们需要做的第一件事就是创建一个 Selector // Create a new selector Selector selector Selector.open();然后我们将对不同的通道对象调用 register() 方法以便注册我们对这些对象中发生的 I/O 事件的兴趣。register() 的第一个参数总是这个 Selector。 打开一个 ServerSocketChannel 为了接收连接我们需要一个 ServerSocketChannel。事实上我们要监听的每一个端口都需要有一个 ServerSocketChannel 。 对于每一个端口我们打开一个 ServerSocketChannel如下所示 ServerSocketChannel ssc ServerSocketChannel.open(); ssc.configureBlocking( false );ServerSocket ss ssc.socket(); InetSocketAddress address new InetSocketAddress( ports[ii] ); ss.bind( address );第一行创建一个新的 ServerSocketChannel 最后三行将它绑定到给定的端口。 第二行将 ServerSocketChannel 设置为 非阻塞的 。我们必须对每一个要使用的套接字通道调用这个方法否则异步 I/O 就不能工作。 选择键 下一步是将新打开的 ServerSocketChannels 注册到 Selector上。为此我们使用 ServerSocketChannel.register() 方法如下所示 SelectionKey key ssc.register( selector, SelectionKey.OP_ACCEPT );register() 的第一个参数总是这个 Selector。 第二个参数是 OP_ACCEPT这里它指定我们想要监听 accept 事件也就是在新的连接建立时所发生的事件。这是适用于 ServerSocketChannel 的唯一事件类型。 请注意对 register() 的调用的返回值。 SelectionKey 代表这个通道在此 Selector 上的这个注册。当某个 Selector 通知你某个传入事件时它是通过提供对应于该事件的 SelectionKey 来进行的。SelectionKey 还可以用于取消通道的注册。 内部循环 现在已经注册了我们对一些 I/O 事件的兴趣下面将进入主循环。使用 Selectors 的几乎每个程序都像下面这样使用内部循环 int num selector.select();Set selectedKeys selector.selectedKeys(); Iterator it selectedKeys.iterator();while (it.hasNext()) {SelectionKey key (SelectionKey)it.next();// ... deal with I/O event ... }首先我们调用 Selector 的 select() 方法。这个方法会阻塞直到至少有一个已注册的事件发生。当一个或者更多的事件发生时 select() 方法将返回所发生的事件的数量。 接下来我们调用 Selector 的 selectedKeys() 方法它返回发生了事件的 SelectionKey 对象的一个 集合 。 我们通过迭代 SelectionKeys 并依次处理每个 SelectionKey 来处理事件。对于每一个 SelectionKey你必须确定发生的是什么 I/O 事件以及这个事件影响哪些 I/O 对象。 监听新连接 程序执行到这里我们仅注册了 ServerSocketChannel并且仅注册它们“接收”事件。为确认这一点我们对 SelectionKey 调用 readyOps() 方法并检查发生了什么类型的事件 if ((key.readyOps() SelectionKey.OP_ACCEPT) SelectionKey.OP_ACCEPT) {// Accept the new connection// ... }可以肯定地说 readOps() 方法告诉我们该事件是新的连接。 接受新的连接 因为我们知道这个服务器套接字上有一个传入连接在等待所以可以安全地接受它也就是说不用担心 accept() 操作会阻塞 ServerSocketChannel ssc (ServerSocketChannel)key.channel(); SocketChannel sc ssc.accept();下一步是将新连接的 SocketChannel 配置为非阻塞的。而且由于接受这个连接的目的是为了读取来自套接字的数据所以我们还必须将 SocketChannel 注册到 Selector上如下所示 sc.configureBlocking( false ); SelectionKey newKey sc.register( selector, SelectionKey.OP_READ );注意我们使用 register() 的 OP_READ 参数将 SocketChannel 注册用于 读取 而不是 接受 新连接。 删除处理过的 SelectionKey 在处理 SelectionKey 之后我们几乎可以返回主循环了。但是我们必须首先将处理过的 SelectionKey 从选定的键集合中删除。如果我们没有删除处理过的键那么它仍然会在主集合中以一个激活的键出现这会导致我们尝试再次处理它。我们调用迭代器的 remove() 方法来删除处理过的 SelectionKey it.remove();现在我们可以返回主循环并接受从一个套接字中传入的数据(或者一个传入的 I/O 事件)了。 传入的 I/O 当来自一个套接字的数据到达时它会触发一个 I/O 事件。这会导致在主循环中调用 Selector.select()并返回一个或者多个 I/O 事件。这一次 SelectionKey 将被标记为 OP_READ 事件如下所示 } else if ((key.readyOps() SelectionKey.OP_READ) SelectionKey.OP_READ) {// Read the dataSocketChannel sc (SocketChannel)key.channel();// ... }与以前一样我们取得发生 I/O 事件的通道并处理它。在本例中由于这是一个 echo server我们只希望从套接字中读取数据并马上将它发送回去。 回到主循环 每次返回主循环我们都要调用 select 的 Selector()方法并取得一组 SelectionKey。每个键代表一个 I/O 事件。我们处理事件从选定的键集中删除 SelectionKey然后返回主循环的顶部。 这个程序有点过于简单因为它的目的只是展示异步 I/O 所涉及的技术。在现实的应用程序中我们需要通过将通道从 Selector 中删除来处理关闭的通道。而且我们可能要使用多个线程。这个程序可以仅使用一个线程因为它只是一个演示但是在现实场景中创建一个线程池来负责 I/O 事件处理中的耗时部分会更有意义。
http://www.hkea.cn/news/14274658/

相关文章:

  • 江苏神禹建设有限公司网站深圳的网站建设公司哪家好
  • 汽车用品网站源码外贸企业网站优化
  • 四川省建设网站电子签章网站规划与建设需求分析
  • 上海备案证查询网站查询网站查询系统江都建设银行网站
  • 网页制作与网站建设宝典 pdf设计自己的logo
  • 正规免费发布信息网站网站被黑能查到是谁做的吗
  • 郑州好的网站建设公司哪家好广告网站建设报价
  • 怎么制作网站建设宝安官网网站建设比较好的
  • 南宁网站建设培训班宿迁莱布拉网站建设
  • 注册公司那家网站做的比较好led灯笼河网站建设
  • 开放大学门户网站建设方案百度应用市场app下载安装
  • 可视化建站源码中国建设银行网站网上业务服务范围
  • 如何做的网站手机可以用吗免费网站建设基础步骤
  • 做网站套路长沙网络工程学院
  • 城阳网站改版网站开发摊销年限
  • 做网站的公司哪家有名办公室装修案例
  • 比较好的网站开发服务商邯郸做淘宝网站
  • 行情网免费网站大全电子商务策划书模板
  • 湖州网站建设哪家好查企业免费的网站
  • 做资源网站盈利点centos6.5 wordpress
  • 高中生做那个的网站在那做网站
  • 网站中在线咨询怎么做淄博周村网站建设报价
  • 网站建设 移动端网站icp备案有效时间
  • 网站开发人员应具备什么素质新媒体宣传推广方案
  • 商务网站创建方案建设网站需要什么
  • 网站算信息化建设唐山网站定制
  • 什么网站可以在线做考教师岗位的题wordpress自媒体模版
  • 苏州免费自助建站网站建设广州贝勤网络科技有限公司
  • 服务器iis做网站域名注册商平台
  • 网站动态图片如何做外贸营销邮件主题