nio

【Java NIO 简例】ServerSocketChannel

元气小坏坏 提交于 2020-01-19 00:56:32
原文:《 Java NIO ServerSocketChannel 》 Java NIO 中的 ServerSocketChannel 用于在TCP通信中监听来自客户端的连接。 开启 ServerSocketChannel Java代码 ServerSocketChannel channel = ServerSocketChannel.open(); 关闭 ServerSocketChannel 可直接调用 ServerSocketChannel.close() 方法,也可以 try-with-resources 的方式关闭。 Java代码 channel.close(); 监听来自客户端的连接 通过 ServerSocketChannel.accept() 方法可以获得一个来自客户端的 SocketChannel 实例。 如果 ServerSocketChannel 是阻塞模式的,此方法将阻塞,直到获得一个来自客户端的连接或出错。 如果 ServerSocketChannel 是非阻塞模式的,此方法会立即返回;如果没有连接,返回值为null。 示例: Java代码 while (true) { SocketChannel clientChannel = serverSocketChannel.accept(); // 处理客户端连接... } 实际项目中可以设置自定义的退出条件

BIO 和 NIO

本秂侑毒 提交于 2020-01-18 09:51:57
一、阻塞(Block)和非阻塞(NonBlock) 阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候阻塞: 阻塞:往往需要等待缞冲区中的数据准备好过后才处理其他的事情,否則一直等待在那里。 非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回 二、BIO与NIO 1、区别 2、Java NIO和IO之间第一个最大的区别是,IO是面向流的而NIO是面向缓冲区的 3、阻塞与非阻塞原因 :   (1)Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。   (2)Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 4、BIO读文件方式 5、NIO简介:核心对象需要掌握:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。 (1)缓冲区(Buffer)   缓冲区实际上是一个容器对象,更直接的说,其实就是一个数组,在NIO库中,所有数据都是用缓冲区处理的。在读取数据时

NIO框架

随声附和 提交于 2020-01-18 01:06:35
文章目录 NIO Netty 概念 Netty 核心组件 Channel EventLoop 和 EventLoopGroup ChannelHandler,ChannelPipeline 和 ChannelHandlerContext Netty 核心组件关系图 总结 NIO 以前编写网络调用程序的时候 客户端创建一个 Socket,通过这个 Socket 连接到服务端。 服务端根据这个 Socket 创建一个 Thread,用来发出请求。 如果客户端请求数越多,服务端创建的处理线程也会越多。 为了解决上述的问题,推出了 NIO 的概念,也就是(Non-blocking I/O)。其中,Selector 机制就是 NIO 的核心。 1)当每次客户端请求时,会创建一个 Socket Channel,并将其注册到 Selector 上(多路复用器)。 2)然后,Selector 关注服务端 IO 读写事件,此时客户端并不用等待 IO 事件完成,可以继续做接下来的工作。 3)一旦,服务端完成了 IO 读写操作,Selector 会接到通知,同时告诉客户端 IO 操作已经完成。 4)接到通知的客户端,就可以通过 SocketChannel 获取需要的数据了。 Netty 概念 Netty 是一个异步的、基于事件驱动的网络应用框架。 Netty 核心组件 Channel

受”误解“的Java AIO

天大地大妈咪最大 提交于 2020-01-18 00:01:16
为什么说 AIO 受”误解“,虽然这个”误解“被打上了双引号,但还是不得不承认它的发展状况并不好。AIO 是 Java 7 开始提供的新特性,而这个”新特性“到如今都成了陈年老酒还鲜有人去品味它。要知道 Java 7 可是在 2011年7月份发布的,市面上基于 AIO 实现的通信框架竟然寥寥无几,关于这项技术的介绍文章也普遍比较粗略。通过阅读那些介绍 AIO 的文章,似乎从学术层面大家就不怎么待见这项技术。 作为 AIO 的学习者、受益者,我觉得有必要先对网上的一些 ”偏见“ 表达一下自己的观点。如果能有幸在认知上搭成共识,之后的学习交流会更加顺畅一点。通常偏见源于比较,AIO 与 BIO、NIO 的对比明细如表所示。 误解一 通过上表的比较可以看出 AIO 的性价比应该是优于 NIO 的,而实际情况却是大多数人更偏爱与 NIO,准确的说应该是偏爱 NIO 通信框架:Netty。这本无可厚非,Netty 确实是一款非常优秀的项目,可是很多人错误的解读了 Netty 在 Github 上关于不支持 AIO 的理由,这更加遏制了 AIO 的发展。 Not faster than NIO (epoll) on unix systems (which is true) 这句话表达的本意应该是:NIO 和 AIO 在 unix 系统上使用的都是 epoll 模式,本质都是一样的。但 Not

Java NIO

走远了吗. 提交于 2020-01-17 02:12:14
NIO:non-blocking input output NIO核心类 Channel 类似于Stream,但是是双向的 非阻塞性 操作唯一性,通过Buffer 文件类:FileChannel UDP类:DatagramChannel TCP类:ServerSocketChannel/SocketChannel 使用: //服务器通过Socket创建channel ServerSocketChannel serverSocketChannel = ServerSocketChannel . open ( ) ; //绑定端口 serverSocketChannel . bind ( new InetSocketAddress ( 8000 ) ) ; //监听客户端连接,建立socketChannel连接 SocketChannel socketChannel = serverSocketChannel . accept ( ) ; //客户端连接远成主机 SocketChannel socketChannel = SocketChannel . open ( new InetSocketAddress ( "127.0.0.1" , 8000 ) ) ; Buffer 作用:读写Channel中的数据 属性: Capacity Position Limit Mark 使用: /

Netty简介与入门

≡放荡痞女 提交于 2020-01-16 21:02:53
netty简介 Netty是由JBOSS提供的基于Java NIO的开源框架,Netty提供异步非阻塞、事件驱动、高性能、高可靠、高可定制性的网络应用程序和工具,可用于开发服务端和客户端。 netty 可以实现: HTTP服务器 FTP服务器 UDP服务器 RPC服务器 WebSocket服务器 Redis的Proxy服务器 MySQL的Proxy服务器 传统HTTP服务器的实现 1、创建一个ServerSocket,监听并绑定一个端口 2、一系列客户端来请求这个端口 3、服务器使用Accept,获得一个来自客户端的Socket连接对象 4、启动一个新线程处理连接 4.1、读Socket,得到字节流 4.2、解码协议,得到Http请求对象 4.3、处理Http请求,得到一个结果,封装成一个HttpResponse对象 4.4、编码协议,将结果序列化字节流 写Socket,将字节流发给客户端 5、继续循环步骤 3 HTTP服务器之所以称为HTTP服务器,是因为编码解码协议是HTTP协议。如果协议是Redis协议,那它就成了Redis服务器,如果协议是WebSocket,那它就成了WebSocket服务器,等等。 使用Netty你就可以定制编解码协议,实现自己的特定协议的服务器 原生JDK存在的问题: 1、API复杂 2、要对多线程很熟悉:因为NIO涉及到Reactor模式 3

why client can not receive message from server (java)

夙愿已清 提交于 2020-01-16 08:44:09
问题 I have just started learning java. I modified the client side code for a server/client communication program, by creating two threads for the client side, main thread for receiving user's input, and inputThread for receiving server's response. I am sure that server has sent the response to client, however, no response message is obtain at client. Here is my code. Can anyone help me to figure it out? Thanks package clientnio; import java.net.*; import java.nio.*; import java.io.*; import java

Java NIO(一):零拷贝

半世苍凉 提交于 2020-01-16 05:07:34
什么是零拷贝 维基上是这么描述零拷贝的:零拷贝描述的是CPU不执行拷贝数据从一个存储区域到另一个存储区域的任务,这通常用于通过网络传输一个文件时以减少CPU周期和内存带宽。 零拷贝给我们带来的好处 减少甚至完全避免不必要的CPU拷贝,从而让CPU解脱出来去执行其他的任务 减少内存带宽的占用 通常零拷贝技术还能够减少用户空间和操作系统内核空间之间的上下文切换 零拷贝的实现 零拷贝实际的实现并没有真正的标准,取决于操作系统如何实现这一点。零拷贝完全依赖于操作系统。操作系统支持,就有;不支持,就没有。不依赖Java本身。 传统I/O 在Java中,我们可以通过InputStream从源数据中读取数据流到一个缓冲区里,然后再将它们输入到OutputStream里。我们知道,这种IO方式传输效率是比较低的。那么,当使用上面的代码时操作系统会发生什么情况: 1. JVM发出read() 系统调用。 2. OS上下文切换到内核模式(第一次上下文切换)并将数据读取到内核空间缓冲区。(第一次拷贝:hardware —-> kernel buffer) 3. OS内核然后将数据复制到用户空间缓冲区(第二次拷贝: kernel buffer ——> user buffer),然后read系统调用返回。而系统调用的返回又会导致一次内核空间到用户空间的上下文切换(第二次上下文切换)。 4.

Java BIO NIO 与 AIO

二次信任 提交于 2020-01-15 22:39:14
回顾 上一章我们介绍了操作系统层面的 IO 模型。 阻塞 IO 模型。 非阻塞 IO 模型。 IO 复用模型。 信号驱动 IO 模型(用的不多,知道个概念就行)。 异步 IO 模型。 并且介绍了 IO 多路复用的底层实现中,select,poll 和 epoll 的区别。 几个概念 我们在这里在强调一下几个概念。 一个 IO 操作的具体步骤: 对于操作系统来说,进程是没有直接操作硬件的权限的,所以必须请求内核来帮忙完成。 等待数据准备好,对于一个套接字上得操作,这一步骤关系到数据从网络到达,并将其复制到内核某个缓冲区。 将数据从内核缓冲区复制到进程缓冲区。 同步和异步的区别在于第二个步骤是否阻塞,如果从内核缓冲区复制到用户缓冲区的过程阻塞,那么就是同步 IO,否则就是异步 IO。所以上面提到的前四种 IO 模型都是同步 IO,最后一种是异步 IO。 阻塞和非阻塞的区别在于第一步,发起 IO 请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞 IO,否则就是非阻塞 IO。所以上面提到的第一种 IO 模型是阻塞 IO,其余的都是非阻塞 IO。 Java IO API 介绍完操作系统层面的 IO 模型,我们来看看,Java 提供的 IO 相关的 API。 Java 中提供三种 IO 操作的 API,阻塞 IO(BIO,同步阻塞),非阻塞 IO(NIO,同步非阻塞)和异步 IO (AIO

How to determine if a file will be logically moved or physically moved

扶醉桌前 提交于 2020-01-15 10:23:08
问题 The facts: When a file is moved, there's two possibilities: The source and destination file are on the same partition and only the file system index is updated The source and destination are on two different file system and the file need to be moved byte per byte. (aka copy on move) The question: How can I determine if a file will be either logically or physically moved ? I'm transferring large files (700+ megs) and would adopt a different behaviors for each situation. Edit: I've already