`
QING____
  • 浏览: 2253289 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NIO-SocketChannel详解

 
阅读更多

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]
分享到:
评论

相关推荐

    Java NIO实战开发多人聊天室

    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视频教程

    Java NIO-Channel-FileChannel详解(一) - **主要内容**:深入探讨FileChannel的高级用法,如文件锁定等。 - **学习目标**:掌握FileChannel的进阶功能。 #### 6. Java NIO-Channel-FileChannel详解(二) - **主要...

    Java-NIO-系列教程

    ### Java NIO 系列教程知识点详解 #### 一、Java NIO 概述 Java NIO (New IO) 是 Java SE 1.4 版本引入的一种新的输入/输出方式,它提供了一种替代传统的 Java IO 包的方式。Java NIO 主要包括三个核心组成部分:*...

    JAVA IO-NIO 详解

    ### JAVA IO-NIO 详解 #### 一、IO与NIO概述 在Java开发中,输入/输出(IO)操作是程序与外部环境交互的重要环节。通过IO操作,程序可以读取外部数据或向外部环境输出数据。Java的IO体系自Java 1.0以来就一直存在...

    bio-nio-aio.zip

    《Java IO:从NIO到Reactor三种模式详解》 在Java编程中,IO操作是不可或缺的一部分,尤其在处理大量数据传输或者网络通信时。本文将深入探讨Java中的三种IO模型:传统IO(BIO)、非阻塞IO(NIO)以及反应器模式...

    Java_NIO_API详解

    ### Java NIO API详解 #### 一、引言 在Java早期版本中,I/O操作主要依赖于`java.io`包中的流式API,这些API虽然简单易用,但其本质是阻塞式的,这意味着每次读写操作都会等待直至完成。这种机制在处理大量并发...

    Java NIO详解及源码下载

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO基于块I/O(Blocking I/O),而NIO则基于通道(Channels)和缓冲区(Buffers)...

    Java_NIO_API详解[参照].pdf

    Java.nio.channels包中定义了多种类型的通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel用于网络通信。通道可以与缓冲区交互,数据通过通道读入或写出缓冲区。 3. **选择器(Selector)**:...

    java.nio API详解

    2. `java.nio.channels`:这个包包含一系列Channel接口和它们的实现,如FileChannel、SocketChannel等。Channel代表了一个开放的I/O资源,数据可以通过Channel进行传输。Selector是这个包中的另一个重要组件,它允许...

    Java 高并发八:NIO和AIO详解

    【Java 高并发八:NIO和AIO详解】 NIO(New Input/Output),从Java 1.4版本开始引入,是对传统IO模型的一种改进。传统的IO模型基于流(Stream),而NIO则基于块(Block)进行数据传输,提高了处理大量数据时的效率...

    JavaNIO想详解1

    Java NIO提供了多种类型的通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel分别用于网络连接的读写。通道与传统流的区别在于,通道是双向的,可以同时进行读写操作,而流通常是单向的。 缓冲...

    android nio程序

    ### 二、`NioServer`详解 `NioServer`是基于`java.nio`实现的服务器端程序,通常包括以下几个关键组件: 1. **ServerSocketChannel**:用于监听客户端连接请求。通过`ServerSocketChannel.open()`创建,`bind()`...

    Java NIO详解(学习资料)

    为了实现Java NIO,你需要使用`Selector`、`ServerSocketChannel`和`SocketChannel`,并利用缓冲区进行数据交换。通过选择器,服务器可以在一个单独的线程中处理多个客户端连接,显著提升了并发性能。在处理高并发...

    多线程NIO客户端实例

    - **选择器(Selector)**:选择器用于监听多个SocketChannel的就绪事件,当某个通道有数据可读或可写时,选择器会通知应用程序,这是NIO并发的关键所在。 - **缓冲区(ByteBuffer)**:在NIO中,所有数据都通过`...

    javaNIO很好的资料

    ### Java NIO 相关知识点详解 #### Java NIO 概述 Java NIO(New IO)是从 Java 1.4 版本开始引入的一种新的 I/O 处理方式,它提供了一种不同于传统 Java IO 的操作模式。NIO 的核心组件包括 Channel(通道)、...

    nio入门 IBM教材,pdf格式

    ### NIO 入门知识点详解 #### 一、NIO 的引入及其背景 - **NIO 的起源**:NIO(New Input/Output)库是在 JDK 1.4 中引入的,旨在解决传统 Java I/O 操作的局限性和性能瓶颈。 - **改进目标**:NIO 通过提供高速...

    Android开发进阶之NIO非阻塞包

    1. **SocketChannel**:这是NIO中用于网络通信的核心类之一,它可以创建非阻塞的Socket连接,从而实现非阻塞的数据传输。 - **创建SocketChannel**:可以通过`SocketChannel.open()`来创建一个新的SocketChannel...

    Java NIO系列教程(一) Java NIO 概述

    - **SocketChannel**:用于客户端TCP连接的读写操作。 - **ServerSocketChannel**:用于监听并接受客户端的TCP连接请求。 - **Buffers**:Buffers是NIO中的数据容器,用于存储从Channel读取的数据或将数据写入...

    Java NIO系列教程

    ### Java NIO 系列教程知识点详解 #### Java NIO 概述 Java NIO (New IO) 是从 Java 1.4 开始提供的一种新的 I/O 处理方式,旨在改进传统 Java IO API 的性能并引入更高效的数据处理机制。Java NIO 主要包括三大...

Global site tag (gtag.js) - Google Analytics