SocketChannel为JAVA-NIO中核心类,它实现了SelectableChannel/ScatteringByteChannel/GatheringByteChannel.不过它仍然为一个抽象类.实现层将会有JVM在运行时选择.(参见下文)
SocketChannel只不过是Socket通讯 + Selector机制的抽象层API,底层的通讯仍需要socket支持.
可以通过open()方法创建SocketChannel,底层通过SelectorProvider.provider().openSocketChannel(),采用系统默认的provider创建底层的通道,新创建的socketChannel已经打开,但并未建立TCP连接,此时尝试进行IO操作,将抛出异常(NotYetConnectedException).此后需要connect(remote)方法来建立连接;SocketChannel支持在非阻塞模式下连接:connect方法发起远程TCP连接,但是其立即返回,不过连接的过程仍然在进行,之后需要通过finishConnect方法检测并完成链接,可以通过isConnectionPending()检测链接是否正在进行.
可单独的关闭套接字通道的input和output,而无需关闭Channel;如果通过Socket关闭了当前channel的input,那么此后在channel上的read操作,将直接返回-1(EOF).如果通过Socket关闭了channel的output,那么此后在次channel上的write操作,将抛出ClosedChannelException.
事实上channel即为socket链接的高层封装,每个channel都绑定在一个socket上,它们息息相关.
SocketChannel的关闭支持异步关闭(来自InterruptableChannel特性),这与Channel类中指定的异步close操作有关.如果一个线程关闭了某个Socket input,那么同时另一个线程被阻塞在该SocketChannel的read操作中,那么处于阻塞线程中的读取操作将完成,而不读取任何字节且返回-1.如果一个线程关闭了socket output,而同时另一个线程被阻塞在该socketChannel的write操作中,此时阻塞线程将收到AsynchronousClosedException.
SocketChannel是线程安全的,但是任何时刻只能有一个线程处于read或者write操作(read操作同步readLock,write操作同步writeLock,2个线程可以同时进行read和write;),不过DatagramChannel支持并发的读写.
connect和finishConnect方法是互相同步的(一个同步锁对象).
- public static SocketChannel open() throws IOException:开启一个通道,通过调用系统默认的provider.openSockentChannel方法创建通道.
- public static SocketChannel open(SocketAddress remote) throws IOException:等效于与open(),connect(remote).
- public final int validOps():返回其支持的操作集.对于SocketChannel除了不支持OP_ACCEPT之外,其他操作均支持.
- public abstract boolean isConnected():判断此通道关联的socket是否已经建立连接.
- public abstract boolean isConnectionPending():判断通道是否正在进行操作连接.只有当尚未finishConnection且已经调用connect时,返回true.
- public abstract boolean connect(SocketAddress remote) throws IOException:底层socket建立连接.如果此通道为非阻塞模式,则调用此方法发起一个非阻塞连接操作.如果连接立即建立成功,则返回true,否则返回false.则此后必须通过调用finishConnect方法来完成链接.如果通道出去阻塞模式,则阻塞直到建立链接成功或者网络异常返回.可以在任意时间调用此方法.如果正在调用此方法时在此通道上调用了read或者write(原则上说几乎不应该如此操作),那么read/write将阻塞.底层实现简析:参见(SocketChannelImpl: http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/nio/ch/SocketChannelImpl.java.html);此方法将会对readLock/writeLock对象锁进行同步,由此可见在connect时,将阻塞read/write操作.
//建立连接的参考代码 try{ begin();//中断响应 connectThread.doConnect();//对于remote为本地连接时,极有可能会立即返回 if(connectSuccess){ return true; } if(isBlocking){ for(;;){ if(connectSucees){ return true; } } }else{ state = CONNECT_PENDING; return false; } }finally{ end(boolean);//中断响应 }catch(Exception e){ close(); throw e; }
- public abstract boolean finishConnect() throws IOException:促成套接字连接完成.此方法支持与channel的非阻塞模式中.如果已经建立连接则返回true.否则返回false.此方法在非阻塞模式下会立即返回.
boolean isSuccess = channel.connect(remote); if(!isSuccess){ while(!finishConnect()){ Thread.sleep(500); } }
- public abstract long read(ByteBuffer) throws IOException:来自readableChannel.对于一定数量的字节,并交付给ByteBuffer.在非阻塞模式下,有可能立即返回.
- public abstract long read(ByteBuffer[] dst):来自ScatteringByteChannel.对于read操作,其内部将同步readLock(对象锁)和stateLock(和connect()方法同步一个锁);此方法支持中断响应,因此又有了begin()/end()方法的出现.[参考:http://shift-alt-ctrl.iteye.com/blog/1841324]
相关推荐
09-Java NIO-Channel-SocketChannel.mp4 10-Java NIO-Channel-DatagramChannel.mp4 11-Java NIO-Channel-分散和聚集.mp4 12-Java NIO-Buffer-概述.mp4 13-Java NIO-Buffer-基本使用.mp4 14-Java NIO-Buffer-三个属性...
Java NIO-Channel-FileChannel详解(一) - **主要内容**:深入探讨FileChannel的高级用法,如文件锁定等。 - **学习目标**:掌握FileChannel的进阶功能。 #### 6. Java NIO-Channel-FileChannel详解(二) - **主要...
### Java NIO 系列教程知识点详解 #### 一、Java NIO 概述 Java NIO (New IO) 是 Java SE 1.4 版本引入的一种新的输入/输出方式,它提供了一种替代传统的 Java IO 包的方式。Java NIO 主要包括三个核心组成部分:*...
### JAVA IO-NIO 详解 #### 一、IO与NIO概述 在Java开发中,输入/输出(IO)操作是程序与外部环境交互的重要环节。通过IO操作,程序可以读取外部数据或向外部环境输出数据。Java的IO体系自Java 1.0以来就一直存在...
《Java IO:从NIO到Reactor三种模式详解》 在Java编程中,IO操作是不可或缺的一部分,尤其在处理大量数据传输或者网络通信时。本文将深入探讨Java中的三种IO模型:传统IO(BIO)、非阻塞IO(NIO)以及反应器模式...
### Java NIO API详解 #### 一、引言 在Java早期版本中,I/O操作主要依赖于`java.io`包中的流式API,这些API虽然简单易用,但其本质是阻塞式的,这意味着每次读写操作都会等待直至完成。这种机制在处理大量并发...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO基于块I/O(Blocking I/O),而NIO则基于通道(Channels)和缓冲区(Buffers)...
Java.nio.channels包中定义了多种类型的通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel用于网络通信。通道可以与缓冲区交互,数据通过通道读入或写出缓冲区。 3. **选择器(Selector)**:...
2. `java.nio.channels`:这个包包含一系列Channel接口和它们的实现,如FileChannel、SocketChannel等。Channel代表了一个开放的I/O资源,数据可以通过Channel进行传输。Selector是这个包中的另一个重要组件,它允许...
【Java 高并发八:NIO和AIO详解】 NIO(New Input/Output),从Java 1.4版本开始引入,是对传统IO模型的一种改进。传统的IO模型基于流(Stream),而NIO则基于块(Block)进行数据传输,提高了处理大量数据时的效率...
Java NIO提供了多种类型的通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel分别用于网络连接的读写。通道与传统流的区别在于,通道是双向的,可以同时进行读写操作,而流通常是单向的。 缓冲...
### 二、`NioServer`详解 `NioServer`是基于`java.nio`实现的服务器端程序,通常包括以下几个关键组件: 1. **ServerSocketChannel**:用于监听客户端连接请求。通过`ServerSocketChannel.open()`创建,`bind()`...
为了实现Java NIO,你需要使用`Selector`、`ServerSocketChannel`和`SocketChannel`,并利用缓冲区进行数据交换。通过选择器,服务器可以在一个单独的线程中处理多个客户端连接,显著提升了并发性能。在处理高并发...
- **选择器(Selector)**:选择器用于监听多个SocketChannel的就绪事件,当某个通道有数据可读或可写时,选择器会通知应用程序,这是NIO并发的关键所在。 - **缓冲区(ByteBuffer)**:在NIO中,所有数据都通过`...
### Java NIO 相关知识点详解 #### Java NIO 概述 Java NIO(New IO)是从 Java 1.4 版本开始引入的一种新的 I/O 处理方式,它提供了一种不同于传统 Java IO 的操作模式。NIO 的核心组件包括 Channel(通道)、...
### NIO 入门知识点详解 #### 一、NIO 的引入及其背景 - **NIO 的起源**:NIO(New Input/Output)库是在 JDK 1.4 中引入的,旨在解决传统 Java I/O 操作的局限性和性能瓶颈。 - **改进目标**:NIO 通过提供高速...
1. **SocketChannel**:这是NIO中用于网络通信的核心类之一,它可以创建非阻塞的Socket连接,从而实现非阻塞的数据传输。 - **创建SocketChannel**:可以通过`SocketChannel.open()`来创建一个新的SocketChannel...
- **SocketChannel**:用于客户端TCP连接的读写操作。 - **ServerSocketChannel**:用于监听并接受客户端的TCP连接请求。 - **Buffers**:Buffers是NIO中的数据容器,用于存储从Channel读取的数据或将数据写入...
### Java NIO 系列教程知识点详解 #### Java NIO 概述 Java NIO (New IO) 是从 Java 1.4 开始提供的一种新的 I/O 处理方式,旨在改进传统 Java IO API 的性能并引入更高效的数据处理机制。Java NIO 主要包括三大...