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

长春网络营销网站wordpress跳过短代码

长春网络营销网站,wordpress跳过短代码,军事头条免费下载安装,山西 旅游 英文 网站建设文章目录 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.dnsts.com.cn/news/104855.html

相关文章:

  • php做的大型网站wordpress skype
  • 高端网站的特点sem是什么职位
  • 珠宝手机网站模板滨海做网站的公司
  • 网站建设的要求优秀企业网站建设价格
  • 汉口制作网站免费网站推广文章
  • 邹城网站建设多少钱义乌专业做网站
  • 安阳网站建设_腾讯云中使用wordpress
  • 企业建网站哪家好wordpress tag分类
  • 服务高端网站建设开发公司工程部工作总结
  • 为什么邮箱突然进不去了总提示正在进入不安全网站中国亚马逊官网
  • 模板网站建设哪家好国内永久免费的crm系统软件
  • 网站排名软件利搜怎么样域名是什么
  • 网站制作都有哪些网店推广的方法有哪些
  • html5博客网站源码公司网址制作
  • 个人网站备案注意事项网站虚拟视频主持人
  • 浅析个人网站的设计论文营销网站
  • 网站建设设计师的工作内容网站一般字体
  • 建设的比较好的网站前端开发工作
  • 展会网站怎么做wordpress萌主题
  • 温州外贸网站制作怎么推广产品
  • 制作企业网站多少钱西安产品设计公司有哪些
  • 织梦企业 网站源码seo查询是什么意思
  • 如何做网站家具导购如何做推广宣传
  • 中国山东网站建设网页创意的再设计
  • 网站院长信箱怎么做wordpress默认中文
  • 建设工程标准 免费下载网站网站版块建设
  • 网站开发算互联网公司吗服务平台是什么意思
  • 做网站要收订金吗邵东网站
  • 如何在外管局网站做付汇延期企业网站整站
  • 网站推广的内容商丘雷光网络科技有限公司