nio

Java新NIO中的ByteBuffer

一世执手 提交于 2020-01-25 07:32:53
1. ByteBuffer中的参数position、limit、capacity、mark含义: position:表示当前指针的位置(下一个要操作的数据元素的位置) limit:表示当前数组最大的使用量,即有效位置的EOF位置(缓冲区数组中不可操作的下一个元素的位置,limit<=capacity) capacity:表示缓冲区最大容量(缓冲区数据的总长度) mark:用于记录当前position的前一个位置或者默认是-1 2. ByteBuffer中常用方法含义: reset():把position设置为mark的值,相当于之前做过一个标记,现在回退到之前标记的地方。 clear():将参数设置为position=0,limit=capacity,mark=-1,类似于初始化,但并不影响底层byte数组的内容(注意:clear只是把指针移到位置0,并没有真正清空数据)。 flip():将参数设置为limit=position,position=0,mark=-1,翻转,即将未翻转之前0到position之间的数据放置到翻转之后的position(即0)到limit之间的这块区域,翻转将缓冲区的状态由存数据变为准备取数据(注意:将当前位置设置为EOF,指针位置指向0)。 rewind():将参数设置为position=0,mark=-1,limit的值不变(注意:指针指向0)。

Netty序章之BIO NIO AIO演变

喜夏-厌秋 提交于 2020-01-25 03:48:15
Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发 高性能 、 高可靠 的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司都在使用的技术。更是面试的加分项。Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架。而BIO,NIO,AIO更是笔试中要考,面试中要问的技术。也是一个很好的加分项,加分就是加工资,你还在等什么?本章带你细细品味三者的不同! 流程图: 技术:BIO,NIO,AIO 说明:github上有更全的源码。 源码:https://github.com/ITDragonBlog/daydayup/tree/master/Netty/socket-io BIO BIO 全称Block-IO 是一种 阻塞同步 的通信模式。我们常说的Stock IO 一般指的是BIO。是一个比较传统的通信方式, 模式简单 , 使用方便 。但 并发处理能力低 , 通信耗时 , 依赖网速 。 BIO 设计原理: 服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式。若客户端数量增多,频繁地创建和销毁线程会给服务器打开很大的压力。后改良为用线程池的方式代替新增线程,被称为伪异步IO。 服务器提供IP地址和监听的端口

[Netty 1] 初识Netty

五迷三道 提交于 2020-01-24 17:56:26
1. 简介 最早接触netty是在阅读Zookeeper源码的时候,后来看到Storm的消息传输层也由ZMQ转为Netty,所以决心好好来研究和学习一下netty这个框架。 Netty项目地址: http://netty.io/index.html Github项目: https://github.com/netty/netty Netty是一个异步的、事件驱动的网络应用框架,基于它能够快速开发高性能协议的服务器和客户端。Netty是基于NIO的,它大大简化了网络编程,Netty强调“quick and easy“,但并不仅限于”quick and easy“,它的实现是建立在吸取了许多协议(FTP、SMTP、HTTP等)的实现经验的基础之上的,经过作者精心的设计探索,成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 2. 架构介绍 netty的架构图: 我们可以看到主要有三大部分组成:Core、Transport Services和Protocol Support。 2.1 Core Core封装了底层通信接口并提供了一个抽象的可扩展的事件模型。 2.1.1 Zero-Copy-Capable Rich Byte Buffer netty基于NIO,但是它并没有使用NIO的ByteBuffer,而是使用了自己定义的Buffer:

Number of socket clients connected to server

核能气质少年 提交于 2020-01-24 17:23:31
问题 I have a NIO TCP server which accepts and reads data from clients. I would like to know the count number of clients connected at regular intervals, for monitoring purpose ( like netstat or lsof ) in java . Is there any way to achieve this without maintaining a counter and increment it every time a client connects? Something like: int clientsConnected = serverSocket.getClientsConnected(); 回答1: There is no way that I can think of, you would just have to have a variable called count and

UnsupportedOperationException on ByteBuffer.asCharArray().array()

独自空忆成欢 提交于 2020-01-24 10:40:30
问题 Could someone be so kind to explain why on the following line I have UnsupportedOperationException? System.out.println(ByteBuffer.wrap(new byte[] {'t', 'e', 's', 't', '\n'}).asCharBuffer().array()); 回答1: The asCharBuffer doesn't wrap a char[] so you cannot obtain its array() It appears what you are trying to do is. System.out.println(Arrays.toString("test\n".toCharArray())); 回答2: Did you read the Javadoc for CharBuffer.array()? Not all CharBuffer s are backed by a char[] . ByteBuffer

JAVA基础知识之NIO.2——Path,Paths,Files

本小妞迷上赌 提交于 2020-01-24 09:55:15
NIO.2 JDK7对NIO进行了重大改进,主要包含以下两方面 新增Path接口,Paths工具类,Files工具类。 这些接口和工具类对NIO中的功能进行了高度封装,大大简化了文件系统的IO编程。 基于异步Channel的IO 在NIO基础上改进后的IO被称为NIO.2 , 上面第一个改进包含在java.nio下新增的包java.nio.file包。 第二个改进包含在原有的java.nio.channels下,新增了多个Aysnchronous开头的channel接口和类。 本文暂时只讨论第一个改进,基于异步Channel的IO将在网络通信中讨论。 Path接口 在java.io及java.nio中,是通过File类来访问文件系统(文件和目录都用File类表示),但是File类不能利用特定文件系统的特性,且性能不高,抛出的异常也太抽象,因此在NIO.2中引入了Path接口。 Path接口表示的是一个与平台无关的路径(文件和目录都用Path表示)。 Path类中包含了常用的操作路径的方法, getRoot()  -Path对象的跟路径 toAbsolutePath() -Path对象的绝对路径 getNameCount() -Path对象里包含的路径数量 Paths工具类 Paths工具类包含了两个返回Path对象的静态方法。 static Path get(URI uri)

DELETE_ON_CLOSE deletes files before close on Linux

╄→尐↘猪︶ㄣ 提交于 2020-01-23 13:49:30
问题 I have this following code using Java 7 nio API: import java.io.IOException; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; public class TestDeleteOnClose { public static void main(String[] args) throws IOException { Path tmp = Files.createTempFile("a", "b"); OutputStream out = Files.newOutputStream(tmp, StandardOpenOption.DELETE_ON_CLOSE); ObjectOutputStream os = new

ByteBuffer getInt() question

大憨熊 提交于 2020-01-23 05:41:27
问题 We are using Java ByteBuffer for socket communication with a C++ server. We know Java is Big-endian and Socket communication is also Big-endian. So whenever the byte stream received and put into a ByteBuffer by Java, we call getInt() to get the value. No problem, no conversion. But if somehow we specifically set the ByteBuffer byte order to Little-endian (my co-worker actually did this), will the Java automatically convert the Big-endian into the Little-endian when the data is put into the

Java NIO - How is Files.isSameFile different from Path.equals

不羁岁月 提交于 2020-01-23 05:28:41
问题 I could not understand how java.nio.file.Files.isSameFile method is different from java.nio.file.Path.equals method. Could anybody please tell how they are different? 回答1: They are very different. For instance: final Path p1 = Paths.get("/usr/src"); final Path p2 = Paths.get("/usr/../usr/src"); p1.equals(p2); // FALSE Files.isSameFile(p1, p2); // true final Path p1 = fs1.getPath("/usr/src"); final Path p2 = fs2.getPath("/usr/src"); p1.equals(p2); // FALSE A Path is equal to another Path if

Java NIO简单介绍(二)

孤街醉人 提交于 2020-01-23 05:07:02
上一篇 《NIO简单介绍(一)》 中讲解了NIO中本地IO相关的内容,这篇重点介绍的NIO的非阻塞式网络通信 一、阻塞与非阻塞 传统的 IO 流都是阻塞式的。也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行 IO 操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端需要处理大量客户端时,性能急剧下降。 Java NIO 是非阻塞模式的。当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作,所以单独的线程可以管理多个输入和输出通道。因此, NIO 可以让服务器端使用一个或有限几个线程来同时处理连接到服务器端的所有客户端。 二、基础概念 选择器( Selector) 是 SelectableChannel 对象的多路复用器, Selector 可以同时监控多个 SelectableChannel 的 IO 状况,也就是说,利用 Selector 可使一个单独的线程管理多个 Channel。 Selector 是非阻塞 IO 的核心。 SelectionKey 表示 SelectableChannel 和 Selector 之间的注册关系