
Socket&NIO&AIO
文章平均质量分 81
NIO基础、Socket基础、AIO基础
吴声子夜歌
个人学习记录
展开
-
同步、异步、阻塞与非阻塞之间的关系
同步、异步、阻塞与非阻塞之间的关系同步、异步、阻塞与非阻塞可以组合成以下4种排列:同步阻塞同步非阻塞异步阻塞异步非阻塞在使用普通的InputStream、OutputStream 类时,就是属于同步阻塞,因为执行当前读写任务一直是当前线程,并且读不到或写不出去就一直是阻塞的状态。阻塞的意思就是方法.不返回,直到读到数据或写出数据为止。NIO技术属于同步非阻塞。当执行“serverSocketChannel.configureBlocking(false)”代码后,也是一直由当前的线程在执行原创 2020-06-11 17:02:42 · 208 阅读 · 0 评论 -
AsynchronousServerSocketChannel和AsynchronousSocketChannel类的使用
AsynchronousServerSocketChannel和AsynchronousSocketChannel类的使用AsynchronousServerSocketChannel类是面向流的侦听套接字的异步通道。1个AsynchronousServerSocketChannel通道是通过调用此类的open()方法创建的。新创建的AsynchronousServerSocketChannel已打开但尚未绑定。它可以绑定到本地地址,并通过调用bind()方法来配置为侦听连接。一旦绑定,accept()方原创 2020-06-11 16:58:56 · 3005 阅读 · 0 评论 -
AsynchronousFileChannel类的使用(二)
读取数据方式1public abstract Future<Integer> read(ByteBuffer dst, long position)方法的作用是从给定的文件位置开始,从该通道将字节序列读人给定的缓冲区。此方法从给定的文件位置开始,将从该通道的字节序列读取到给定的缓冲区。此方法返回Future对象。如果给定位置大于或等于在尝试读取时文件的大小,则Future 的get()方法将返回读取的字节数或-1。此方法的工作方式与AsynchronousByteChannel.read(B原创 2020-06-11 12:49:23 · 370 阅读 · 0 评论 -
AsynchronousFileChannel类的使用(一)
AsynchronousFileChannel类的使用AsynchronousFileChannel类用于读取、写人和操作文件的异步通道。在通过调用此类定义的open()方法打开文件时,将创建一个异步文件通道。该文件包含可读写的、可查询其当前大小的可变长度的字节序列。当写人字节超出其当前大小时,文件的大小会增加。文件的大小在截断时会减小。异步文件通道在文件中没有当前位置,而是将文件位置指定给启动异步操作的每个读取和写人方法。CompletionHandler 被指定为参数,并被调用以消耗I/O操作的原创 2020-06-11 12:08:24 · 969 阅读 · 0 评论 -
Pipe类的使用、SelectorProvider类的使用
Pipe.SinkChannel和Pipe.SourceChannel类的使用Pipe.SinkChannel类标识Pipe的可写入结尾的通道:Pipe.SourceChannel类标识Pipe的可读取结尾的通道:创建Pipe.SinkChannel和Pipe.SourceChannel类的实例需要使用Pipe类。管道由一对通道组成:一个可写人的sink通道和一个可读取的source通道。一旦将某些字节写人接收器通道,就可以按照与写人时完全相同的顺序从源通道中读取这些字节。在另一个线程从管道中原创 2020-06-10 23:26:27 · 612 阅读 · 0 评论 -
DatagramChannel类的使用
DatagramChannel类的使用DatagramChannel类是针对面向DatagramSocket的可选择通道。DatagramChannel 不是DatagramSocket的完整抽象,必须通过调用socket() 方法获得的关联DatagramSocket对象来完成套接字选项的绑定和操作。不可能为任意的已有DatagramSocket创建通道,也不可能指定与DatagramChannel关联的DatagramSocket所使用的DatagramSocketImpl对象。通过调用此类的ope原创 2020-06-10 22:49:19 · 1902 阅读 · 0 评论 -
SelectionKey类的使用
SelectionKey类的使用SelectionKey类标识SelectableChannel在选择器中的注册标记。在每次向选择器注册通道时,就会创建一个 选择键(SelectionKey)。通过调用某个键的cancel()方法、关闭其通道,或者通过关闭其选择器取消该键之前,通道一直保持有效。取消某个键不会立即从其选择器中移除它,而是将该键添加到选择器的已取消键集,以便在下一次进行select()方法操作时移除它。可通过调用某个键的isValid()方法来测试其有效性。选择键包含两个集,是表示为整原创 2020-06-10 21:09:14 · 3402 阅读 · 0 评论 -
Selector类的使用(二)
返回此选择器的键集原创 2020-06-10 13:21:36 · 731 阅读 · 0 评论 -
Selector类的使用(一)
Selector类的使用Selector类的主要作用是作为SelectableChannel对象的多路复用器。可通过调用Selector类的open()方法创建选择器,该方法将使用系统的默认SelectorProvider创建新的选择器。也可通过调用自定义选择器提供者的openSelector()方法来创建选择器。在通过选择器的close()方法关闭选择器之前,选择器一直保持打开状态。通过SelectionKey对象来表示SelectableChannel (可选择通道)到选择器的注册。选择器维护了原创 2020-06-10 00:59:27 · 1376 阅读 · 1 评论 -
ServerSocketChannel类API详解(二)
执行Connect连接操作public abstract boolean connect( SocketAddress remote)方法的作用是连接到远程通道的Socket。如果此通道处于非阻塞模式,则此方法的调用将启动非阻塞连接操作。如果通道呈阻塞模式,则立即发起连接;如果呈非阻塞模式,则不是立即发起连接,而是在随后的某个时间才发起连接。如果连接是立即建立的,说明通道是阻塞模式,当连接成功时,则此方法返回true,连接失败出现异常。如果此通道处于阻塞模式,则此方法的调用将会阻塞,直到原创 2020-06-09 20:59:00 · 382 阅读 · 0 评论 -
ServerSocketChannel类API详解(一)
ServerSocketChannel类获得ServerSocketChannel与ServerSocket对象ServerSocketChannel类是抽象的,并不能直接new实例化,但API中提供了public static ServerSocketChannel open()方法来创建ServerSocketChannel类的实例。open() 方法是静态的,作用是打开服务器套接.字通道。新通道的套接字最初是未绑定的;可以接受连接之前,必须通过它的某个套接字的bind()方法将其绑定到具体的地址。原创 2020-06-09 14:13:36 · 5753 阅读 · 0 评论 -
选择器与I/O多路复用
选择器与I/O多路复用Selector选择器是NIO技术中的核心组件,可以将通道注册进选择器中,其主要作用就是使用1个线程来对多个通道中的已就绪通道进行选择,然后就可以对选择的通道进行数据处理,属于一对多的关系,也就是使用1个线程来操作多个通道,这种机制在NIO技术中称为“I/O 多路复用”。它的优势是可以节省CPU资源,因为只有1个线程,CPU不需要在不同的线程间进行上下文切换。线程的上下文切换是一个非常耗时的动作,减少切换对设计高性能服务器具有很重要的意义。不适用I/O多路复用使用I/O多路复用原创 2020-06-09 00:36:29 · 534 阅读 · 0 评论 -
基于UDP的Socket通信
基于UDP的Socket通信注意,在使用UDP实现Socket通信时一定要使用两台真机,不要使用虚拟机,不然会出现UDP包无法发送的情况。UDP ( User Datagram Protocol,用户数据报协议)是-种面向无连接的传输层协议,提供不可靠的信息传送服务。无连接是指通信时服务端与客户端不需要建立连接,直接把数据包从一端发送到另一端,对方获取数据包再进行数据的处理。UDP是“不可靠的”,是指该协议在网络环境不好的情况下,会丢失数据包,因为没有数据包重传的功能,另外它也不提供对数据包进行分组原创 2020-06-08 22:24:41 · 1517 阅读 · 0 评论 -
Socket类的使用
绑定bind与connect以及端口生成的时机public void bind (SocketAddress bindpoint)方法的作用是将套接字绑定到本地地址。如果地址为null,则系统将随机挑选一个空闲的端口和一个有效的本地地址来绑定套接字。在Socket通信的过程中,服务端和客户端都需要端口来进行通信。而在前面的示例中,都是使用“new ServerSocket (8888)”的代码格式来创建Socket服务端,其中8888就是服务端的端口号。使用代码“new Socket (“localho原创 2020-06-08 21:29:11 · 1296 阅读 · 0 评论 -
ServerSocket类的使用
接受accept与超时Timeoutpublic Socket accept()方法的作用就是侦听并接受此套接字的连接。此方法在连接传入之前一直阻塞。setSoTimeout(timeout)方法的作用是设置超时时间,通过指定超时timeout值启用/禁用SO_TIMEOUT,以ms为单位。在将此选项设为非零的超时timeout值时,对此ServerSocket调用accept()方法将只阻塞timeout的时间长度。如果超过超时值,将引发java.net.SocketTimeoutException,原创 2020-06-08 14:26:30 · 2734 阅读 · 0 评论 -
基于TCP的Socket通信
基于TCP的Socket通信TCP提供基于“流”的“长连接”的数据传递,发送的数据带有顺序性。TCP是一种流协议,以流为单位进行数据传输。短连接: 短连接是当服务端与客户端连接成功后开始传输数据,数据传输完毕后则连接立即关闭,如果还想再次传输数据,则需要再创建新的连接进行数据传输。长连接: 长连接可以实现当服务端与客户端连接成功后连续地传输数据,在这个过程中,连接保持开启的状态,数据传输完毕后连接不关闭。长连接是指建立Socket连接后,无论是否使用这个连接,该连接都保持连接的状态。连接: 在T原创 2020-06-08 01:00:28 · 540 阅读 · 0 评论 -
InterfaceAddress类的使用、NetworkInterface类静态方法
InterfaeAddress类的使用public java.util.List<InterfaceAddress> getInterfaceAddresses()获取网络接口的InterfaceAddresses列表。通过使用InterfaceAddresses 类中的方法可以取得网络接口对应的IP地址、子网掩码和广播地址等相关信息。对于IPv4地址,可以取得IP地址、子网掩码和广播地址,对于IPv6地址,可以取得IP地址和网络前缀长度这样的信息。什么是网络前缀长度?网络前缀长度原创 2020-06-07 18:27:23 · 2205 阅读 · 0 评论 -
NetWorkInterface类常用方法
NetWorkInterface类常用方法NetworkInterface类表示一个由名称和分配给此接口的IP地址列表组成的网络接口,也就是NetworkInterface类包含网络接口名称与IP地址列表。该类提供访问网卡设备的相关信息,如可以获取网卡名称、IP地址和子网掩码等。想要取得NetworkInterface对象,就必须要通过NetworkInterface类的public staticEnumeration<NetworkInterface> getNetworkInterfac原创 2020-06-07 17:53:33 · 11021 阅读 · 0 评论 -
NIO--网络编程
NIO 非阻塞 网络编程原理分析图NIO 非阻塞 网络编程相关的(Selector、SelectionKey、ServerScoketChannel 和 SocketChannel) 关系梳理图当客户端连接时,会通过 ServerSocketChannel 得到 SocketChannelSelector 进行监听 select 方法, 返回有事件发生的通道的个数.将socketCha...原创 2020-02-15 20:45:10 · 305 阅读 · 0 评论 -
NIO--Path、Files
Pathjava.nio.file.Path接口代表一个平台无关的平台路径,描述了目录结构中文件的位置。Path提供的get()方法用来获取Path对象://用于将多个字符串串连成路径Path get(String first, String... more)Path常用方法:booleanendsWith(Stringpath): 判断是否以path路径结束booleansta...原创 2020-02-14 23:11:18 · 275 阅读 · 0 评论 -
NIO--管道(Pipe)
管道(Pipe)Java NIO管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个 sink通道。数据会被写到sink通道,从source通道读取。向管道写数据@Testpublic void test() thorws IOException{ String str = "测试数据"; //创建管道 Pipe pipe = Pipe.open(); /...原创 2020-02-14 22:51:51 · 296 阅读 · 0 评论 -
NIO--选择器(Selector)
选择器(Selector)选择器(Selector) 是 SelectableChannle 对象的多路复用器,Selector 可 以同时监控多个 SelectableChannel 的 IO 状况,也就是说,利用 Selector 可使一个单独的线程管理多个 Channel。Selector 是非阻塞 IO 的核心。SelectableChannle 的结构如下图:选择器的使用创建S...原创 2020-02-14 22:41:37 · 339 阅读 · 0 评论 -
NIO--FileLock文件锁、字符集(Charset)
FileLock在Java新IO中提供了文件锁的功能,这样当一个线程文件锁定之后,其它线程是无法操作此文件的,要想进行文件操作,则要使用FileLock类完成,此类的对象需要FileChannel进行实例化操作。实例化FileLock对象的方法FileLock类的常用方法字符集(Charset)在Java语言中所有的信息都是以UNICODE进行编码的,但是在计算机的世界里不只单单存...原创 2020-02-14 17:10:05 · 315 阅读 · 0 评论 -
NIO--通道(Channel)
通道(Channel)由 java.nio.channels 包定义 的。Channel 表示 IO 源与目标打开的连接。 Channel 类似于传统的“流”。只不过 Channel 本身不能直接访问数据,Channel 只能与 Buffer 进行交互。通道可以用来读取和写入数据,通道类似于之前的输入/输出流,但是程序不会直接操作通道的,所有的内容都是先读到或写入到缓冲区中,再通过缓冲区中取得...原创 2020-02-14 16:57:05 · 1908 阅读 · 0 评论 -
NIO--缓冲区(Buffer)
缓冲区(Buffer)Buffer 就像一个数组,可以保存多个相同类型的数据。根据数据类型不同(boolean 除外) ,有以下 Buffer 常用子类:ByteBufferCharBufferShortBufferIntBufferLongBufferFloatBufferDoubleBuffer上述 Buffer 类 他们都采用相似的方法进行管理数据,只是各自 管理的数...原创 2020-02-14 14:27:19 · 271 阅读 · 0 评论 -
NIO--概述
NIOJava NIO (New IO Non Blocking IO)是从Java1.4版本开始引入的一个新的IO API,可以代替标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。NIO与IO的区别IONIO面向流(Stream Orien...原创 2020-02-14 12:39:00 · 265 阅读 · 0 评论