nio

基础 | 网络编程

╄→尐↘猪︶ㄣ 提交于 2020-02-07 07:16:57
一、计算机网络的相关概念 1.计算机网络 通过传输介质、网络协议和通信设施,将分散在不同位置的计算机互连,实现资源共享和数据传输的系统。 计算机网络的功能: 1.资源共享 2.信息传输与集中处理 3.均衡负荷与分布处理 4.综合信息服务 2.网络编程 又称Socket编程,是指在操作系统,网络管理软件,网络通信协议的管理和协调下,使用计算机编程语言来实现计算机之间的资源共享和信息传递。 二、计算机网络的三要素: 1.IP地址 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址。指的是计算机在网络中的唯一标识,IP地址的长度为32个比特位(4字节),一般用“点分十进制”表示。 分类 首字节开始位 首字节数值范围 网络格式地址 最大网络个数 每个网络最多主机个数 A类 0 0-127 网络.主机.主机.主机 127 16777214 B类 10 128-191 网络.网络.主机.主机 16384 65534 C类 110 192-223 网络.网络.网络.主机 2097152 254 D类 1110 224-239 用于在 IP 网络中的组播,不再分配 E类 1111 240-255 保留作研究之用,不再分配 2.端口号: 端口号用于标识进程的逻辑地址;其有效端口的范围是从 0到65535,其中 0-1024 系统使用或保留端口。注意

JAVA NIO(一)基本概念

眉间皱痕 提交于 2020-02-06 00:18:03
Java NIO(New IO)是从java 1.4版本开始引入的一个新的IO API,可以替代标准的java IO API。 NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。 Sun官方标榜的特性如下: 为所有的原始类型提供(Buffer)缓存支持 字符集编码解码方案 Channel:一个新的原始I/O抽象 支持锁和内存映射文件的文件访问接口 提供多路(non-blocking)非阻塞式的高伸缩性网络I/O NIO的创建目的是为了让Java程序员可以实现高速I/O而无需编写自定义的本机代码。NIO将最耗时的I/O操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。 Java NIO和IO的主要区别 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented) 阻塞IO(Blocking IO) 非阻塞IO(Non Blocking IO) (无) 选择器(Selectors) 通道和缓冲区 Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。 通道表示打开IO设备(比如文件、套接字等)的连接。若需要使用NIO系统,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区对数据进行处理。 简而言之。Channel负责传输,Buffer负责存储。

NIO管道Pipe

不打扰是莪最后的温柔 提交于 2020-02-05 05:12:34
实现开启一条线程向Pipe 管道里面写入数据,另一条线程读取Pipe管道里面的数据 package com . mock ; import org . junit . jupiter . api . Test ; import java . io . IOException ; import java . nio . ByteBuffer ; import java . nio . channels . Pipe ; import java . time . LocalTime ; public class TestPipe { @Test public void test ( ) throws Exception { final Pipe pipe = Pipe . open ( ) ; //一条线程向管道写数据,另一条线程从管道中读取数据 new Thread ( ( ) - > write ( pipe ) ) . start ( ) ; new Thread ( ( ) - > read ( pipe ) ) . start ( ) ; Thread . sleep ( 6000 ) ; } //写数据到管道 public void write ( Pipe pipe ) { try { ByteBuffer byteBuffer = ByteBuffer .

常见IO模型(BIO、NIO、AIO)

点点圈 提交于 2020-02-05 00:59:00
1.网络模型 a.编程模型 TCP UDP TCP->可靠连接、使命必达、速度慢 UDP->不可靠、速度快 1.常见的IO模型 blocking IO == Old IO(BIO) 案例:如果不开线程,那么就会阻塞。 public class Server { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(); ss.bind(new InetSocketAddress("localhost", 8888)); new Thread(()->{ try { Socket s = ss.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); System.out.println(br.readLine()); br.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } }); ss.close(); } } Non-Blocking IO(NIO)->Java的API还不如C 调用Linux底层的epoll(),使用一个Channel

NIO 概述 与 通信实例

给你一囗甜甜゛ 提交于 2020-02-05 00:25:13
NIO 简述: NIO是在jdk1.4之后加入的一种基于缓冲区(buffer)和通道(channel)的I/O方式, nio是同步非阻塞的i/o模式,同步是指线程不断地轮询i/o事件,非阻塞是在处理i/o事件的同时,还可以去处理其它的事情。 同步的核心是Selector(选择器),代替的线程本身的轮询i/o事件,避免了阻塞同时线程的不必要消耗, 非阻塞的核心就是通道和缓冲区,当有i/o事件就绪时,写入到缓冲区,保证i/o成功。而无需等待。 为什么使用nio? 使用nio是为了java程序员可以实现高速的i/o操作,不用编写自定义的本机代码。nio将最耗时的i/o操作转回到操作系统,因而提交了效率。 NIO 通道 缓冲区: 通道可以被异步读写,通道始终读写缓冲区。 channel ——> buffer buffer ——> channel 数据可以从通道读取到缓冲区,也可以是冲缓冲区读取到通道。 Channel有很多种实现 : FileChannel 从文件中读取数据 DataGramChannel 通过udp连接在网络中读取数据 SocketChannel 能通过socket连接在网络中读取数据 ServerSocketChannel 可以监听新进来的tcp连接 Buffer 的实现: byteBuffer charBuffer longBuffer DoubleBuffer ..

网络编程NIO-异步

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-04 23:56:08
异步I/O是没有阻塞地读写数据的方法。通常在代码进行read调用时,代码会阻塞 直至可供读取的数据。同样,write调用将会阻塞直至数据能够写入。 1、selector是一个对象,可以注册到很多个channel上,监听各个channel上发生 的事件,并且能够根据事件情况决定channel读写,这样通过一个线程管理多个channel 创建selector: Selector selector = Selector.open(); 注册channel到selector: channel.configureBlocking(false); SelectionKey key = chanenl.register(selector, SelecltionKey.OP_READ_; 注意,注册channel必须设置为异步模式才可以。register调用的返回值是 selectionKey。这个对象待办这个通道在此selector上的这个注册。当某个selector 通知你某个传入事件时,它是通过提高对应于该事件的SelectionKey来进行的。selectionKey 还可以用于取消通过的注册 2、channel和selector Channel channel = selectionKey.channel(); Selector selector = selectioKey

java.nio异步线程安全的IO

主宰稳场 提交于 2020-02-04 23:51:11
BIO 方式使得整个处理过程和连接是绑定的,只要连接建立,无论客户端是否有消息发送,都要进行等待处理,一定程度上浪费了服务器端的硬件资源,因此就有了 NIO 方式。Java 对于 NIO 方式的支持是通过 Channel和 Selector 方式来实现,采用的方法为向 Channel注册感兴趣的事件,然后通过 Selector 来获取到发生了事件的 key,如发生了相应的事件,则进行相应的处理,否则则不做任何处理,是典型的Reactor 模式,按照这样的方式,就不用像 BIO 方式一样,即使在没有消息的情况下也需要占据一个线程来阻塞读取消息,从而提升服务器的使用效率, 为实现 TCP/IP+NIO 方式的系统间通讯, Java 提供了 SocketChannel和 ServerSocketChannel两个关键的类,网络 IO 的操作则改为通过ByteBuffer 来实现,具体的基于 java实现TCP/IP+NIO 方式的通讯的方法如下所示。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

【Java】NIO中Selector的创建源码分析

百般思念 提交于 2020-02-04 23:50:27
在使用Selector时首先需要通过静态方法open创建Selector对象 1 public static Selector open() throws IOException { 2 return SelectorProvider.provider().openSelector(); 3 } 可以看到首先是调用SelectorProvider的静态方法provider,得到一个Selector的提供者 1 public static SelectorProvider provider() { 2 synchronized (lock) { 3 if (provider != null) 4 return provider; 5 return AccessController.doPrivileged( 6 new PrivilegedAction<SelectorProvider>() { 7 public SelectorProvider run() { 8 if (loadProviderFromProperty()) 9 return provider; 10 if (loadProviderAsService()) 11 return provider; 12 provider = sun.nio.ch.DefaultSelectorProvider.create();

【Netty整理03-NIO】Java 实现 NIO demo

自作多情 提交于 2020-02-04 23:48:17
jdk提供的NIO使用: 概览: https://blog.csdn.net/the_fool_/article/details/83000648 博主抄写了网上的demo,略作修改与调整,原文链接: Demo01:抄写地址忘记了。。。 1、服务端代码: package com.test3; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.util.Iterator; /** * NIO服务端代码 * @author http:// * @author ZX * 监听客户端连接,接收、发送消息 * */ public class AServer { public static void main(String[]args)throws Exception{ System.out.println("================="); //创建选择器 Selector selector = Selector.open(); /

java nio(reactor, selector, selectionKey)

a 夏天 提交于 2020-02-04 23:46:56
SocketChannel vs. ServerSocketChannel 父类:SelectableChannel。Channel表现了一个可以进行IO操作的通道(比如,通过FileChannel,我们可以对文件进行读写操作) ServerSocketChannel主要用在Server中,用于接收客户端的链接请求 SocketChannel则用于真正的读写数据,同时还可以用于客户端发送链接请求。 真正实现读写数据操作的就是这些SocketChannel,上面的ServerSocketChannel只是负责接收连接请求。 以下均简称为channel channel vs. Selector channel需要注册到selector上。channel可以注册到一个或多个Selector上以进行异步IO操作。 channel.register(selector, SelectionKey.OP_ACCEPT); channel.register(selector, xxx, object); //attachment被存放在返回的SelectionKey中 channel.keyFor(selector); //返回该channe在Selector上的注册关系所对应的SelectionKey。若无注册关系,返回null。