nio

BIO、NIO、AIO 个人总结

柔情痞子 提交于 2020-01-22 20:54:47
BIO(blocking io) BIO即为阻塞IO,在网络编程中,它会在建立连接和等待连接的对端准备数据阶段进行阻塞。因此为了支撑高并发的用户访问,一般会为每一个socket 连接分配一个线程。但使用的瓶颈更加明显,无法支持上百万、甚至千万以上的并发。且线程切换带来的开销也更大。 代码示例: Server端 Server 端绑定 8082 端口 通过 accept() 方法 阻塞等待客户端建立连接 当与客户端建立一个 socket 连接通道之后,server 端口将新建一个线程进行 【读】 、【写】 ( ps: 这里的读是阻塞的,因为当server端发起读的请求时, 如果此时对端未准备好数据,那么将一直阻塞等待 。 直到:1. 对端通过 socket 发送数据2. 将数据从内核态 拷贝到用户态 ) try { // 绑定本地 8082 端口 ServerSocket server = new ServerSocket(8082); while (true) { //阻塞等待客户端 socket 建立连接 Socket accept = server.accept(); Thread t = new Thread(new Runnable() { @Override public void run() { // 一个线程处理一个socket 连接 BufferedReader

Find direct and indirect subclasses by scanning filesystem

微笑、不失礼 提交于 2020-01-22 17:42:10
问题 I'm having a problem in writing an algorithm to help me scan a file system and find all subclasses of a certain class. Details: I've an app that scans an external application using nio Files.walk() while retrieving I check for "extends SuperClass" while reading the file if the word exits, I add the class name in my list as follows: List<String> subclasses = new ArrayList<>(); Files.walk(appPath) .filter(p->Files.isRegularFile(p) && p.toString() .endsWith(".java")).forEach(path -> { try { List

BIO、NIO、AIO模型分析

耗尽温柔 提交于 2020-01-22 15:21:10
什么是 I/O 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, Direct I/O、数据库I/O等,常见的I/O有磁盘I/O和网络I/O。 什么是IO的Block呢?考虑下面两种情况: 用系统调用read从socket里读取一段数据 用系统调用read从一个磁盘文件读取一段数据到内存 对于第一种情况,算作Block,因为Linux无法知道网络上对方是否会发数据。如果没数据发过来,对于调用read的程序来说,就只能“等”。对于第二种情况,不算做Block。 一个解释是,所谓“Block”是指操作系统可以预见这个Block会发生才会主动Block。例如当读取TCP连接的数据时,如果发现Socket buffer里没有数据就可以确定定对方还没有发过来,于是Block;而对于普通磁盘文件的读写,也许磁盘运作期间会抖动,会短暂暂停,但是操作系统无法预见这种情况,只能视作不会Block,照样执行。我们讨论的BIO、NIO和AIO都是针对网络I/O模型。 进程中的IO调用步骤大致可以分为以下四步: 进程向操作系统请求数据 ; 操作系统把外部数据加载到内核的缓冲区中; 操作系统把内核的缓冲区拷贝到进程的缓冲区 ; 进程获得数据完成自己的功能 ; 当操作系统在把外部数据放到进程缓冲区的这段时间

ActiveMQ--传输协议

僤鯓⒐⒋嵵緔 提交于 2020-01-22 12:35:18
传输协议 ActiveMQ支持的client-broker通讯协议有: TCP NIO UDP SSL Http(s) VM 其中配置Transport Connector的文件在activeMQ安装目录的conf/activemq.xml中的<transportConnectors>标签之内。 在上图给出的配置信息中: URI描述信息的头部都是采用协议名称:例如 描述amqp协议的监听端口时,采用的URI描述格式为"amqp://…"; 描述Stomp协议的监听端口时,采用的URI描述格式为"stomp://…"; 唯独在进行openwire协议描述时,URI头却采用的"tcp://…"。这是因为ActiveMQ中默认的消息协议就是openwire。 Transmission Control Protocol(TCP): 这是默认的Broker配置,TCP的Client监听端口61616 在网络传输数据前,必须要序列化数据,消息是通过一个叫wire protocol的来序列化成字节流。默认情况下ActiveMQ把wire protocol叫做OpenWire,它的目的是促使网络上的效率和数据快速交互。 TCP连接的URI形式如:tcp://hostname:port?key=value&key=value,后面的参数可选。 TCP传输的优点: TCP协议传输可靠性高,稳定性强

Throwing exception on NIO SSL Handshake process using SSLEngine

扶醉桌前 提交于 2020-01-22 03:22:50
问题 I am getting following exception on NIO SSL handshake. During handshake process, On client side, a) NEED_WRAP b) NEED_UNWRAP c) NEED_TASK d) NEED_UNWRAP - getting the following exception on calling unwrap. javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 1 at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1371) at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:513) at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:790) at

Throwing exception on NIO SSL Handshake process using SSLEngine

孤街浪徒 提交于 2020-01-22 03:22:27
问题 I am getting following exception on NIO SSL handshake. During handshake process, On client side, a) NEED_WRAP b) NEED_UNWRAP c) NEED_TASK d) NEED_UNWRAP - getting the following exception on calling unwrap. javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 1 at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1371) at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:513) at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:790) at

Extract some content from jar-file downloaded with JWS

走远了吗. 提交于 2020-01-21 20:12:09
问题 im trying to extract some files from a jar-file downloaded using java-webstart. below code was used to locate the jar and initiate the FileSystem 1 final ProtectionDomain domain = this.getClass().getProtectionDomain(); 2 final CodeSource source = domain.getCodeSource(); 3 final URL url = source.getLocation(); 4 final URI uri = url.toURI(); 5 Path jarPath = Paths.get(uri); 6 7 FileSystem fs = FileSystems.newFileSystem(jarPath, null); This works fine when the jar-file is on a local disc, but

【Java NIO 简例】Buffer

一个人想着一个人 提交于 2020-01-21 12:42:55
. 原文:《 Java NIO Buffer 》 Buffer 与 Channel 结合使用:从 Channel 读取数据到 Buffer,或 将 Buffer 中的 Channel 写入到 Buffer。 Buffer 内部就是一个内存块。NIO 将该内存块包装成一个 Buffer 对象,以方便对该内存块的操作。 Buffer 基本使用方法 将数据写入 Buffer 调用 buffer.flip() 方法 将 buffer 转换为读模式,内部游标指向头部,以便开始读取数据 从 Buffer 读取数据 调用 buffer.clear() 或 buffer.compact() 方法 clear() 会清除 buffer中的所有数据; compact() 只清除 buffer 中已被读取过的数据,未被读取过的数据将被移到头部 示例:《 Channel 》 Buffer 关键字段 Buffer 内部这就是一个数组(连续的内存块)。Buffer 有3个关键字段来辅助操作该内部数组。 capacity buffer 的容量,表示buffer最多能存放多少数据 position buffer 当前操作的位置。取值范围:[0, capacity-1] 写模式下,position 表示数据将被写入其指向的单元格,写完后 position 增加1; 读模式下,position

嵌入式图形用户界面uc/gui在nios II上的移植

谁都会走 提交于 2020-01-20 01:16:47
嵌入式图形用户界面uc/gui在nios II上的移植 uc/gui是一个优秀的嵌入式图形用户界面,这几天的工作就是将它移植到nios II系统上。前人也做了一些工作,不过大部分都是针对其他硬核处理器,针对nios II软核处理器的移植资料那简直是凤毛麟角。在阅读了相关文档后,我决定自己亲自动手实践,这下面的很多过程都是自己摸索出来的,并通过了实验的验证。这只是一个初步的移植,也许在以后的更复杂的应用中,还需要对其进行调整。但对目前我的应用而言,应该足够了。 写这篇文章的目的一是由于自己记性不好,所以需要给自己留个备忘,免得以后忘的一干二净;二是给有需要的朋友提供一些参考,也好相互交流,共同进步。请大家多提宝贵意见。 一、源码和文档下载 http://www.ucgui.com/ 上有很多不同版本的源码下载,目前能下到的最新版本是3.98,不过还有一些组件不是很完整,但作基础开发已经够用了。 ucgui3.98源码下载地址:uC-GUI-V3-98.zip。 ucgui最新版用户手册下载地址:uC-GUI-user.rar。 开发软件:quartus II 6.0, Nios II IDE 6.0。 二、移植过程 先来看看解压后都有些什么东西: 如图,核心的东西包括Config和GUI两个文件夹,这里面是ucgui的所有源码和配置文件。ConvertColor包含彩色转换函数

【网络爬虫学习 --- 设计爬虫架构】

血红的双手。 提交于 2020-01-19 22:20:16
设计爬虫架构 一个设计良好的爬虫架构必须满足如下需求。 (1) 分布式:爬虫应该能够在多台机器上分布执行。 (2) 可伸缩性:爬虫结构应该能够通过增加额外的机器和带宽来提高抓取速度。 (3) 性能和有效性:爬虫系统必须有效地使用各种系统资源,例如,处理器、存储空间和网络带宽。 (4) 质量:鉴于互联网的发展速度,大部分网页都不可能及时出现在用户查询中,所以爬虫应该首先抓取有用的网页。 (5) 新鲜性:在许多应用中,爬虫应该持续运行而不是只遍历一次。 (6) 更新:因为网页会经常更新,例如论坛网站会经常有回帖。爬虫应该取得已经获取的页面的新的拷贝。例如一个搜索引擎爬虫要能够保证全文索引中包含每个索引页面的较新的状态。对于搜索引擎爬虫这样连续的抓取,爬虫访问一个页面的频率应该和这个网页的更新频率一致。 (7) 可扩展性:为了能够支持新的数据格式和新的抓取协议,爬虫架构应该设计成模块化的形式。 爬虫架构 1. 爬虫的简化版本架构如下图所示 这里最主要的关注对象是爬虫和存储库。其中的爬虫部分阶段性地抓取互联网上的内容。存储库存储爬虫下载下来的网页,是分布式的和可扩展的存储系统。在往存储库中加载新的内容时仍然可以读取存储库。 2. 实际的爬虫逻辑架构如下图所示 [ 单线程爬虫结构 ] 。 其中: (1) URLFrontier 包含爬虫当前待抓取的 URL( 对于持续更新抓取的爬虫