DatagramChannel是NIO中面向Datagram(数据报)的套接字通道.底层为DatagramSocket + selector的高层封装.此接口仍然实现了SeletableChannel,ScatteringByteChannel, GatheringByteChannel .
可以通过DatagramChannel.open()方法打开获得通道,但此时尚未链接.DatagramChannel和DatagramSocket对数据发送/接受方式 有些区别.尽管DatagramChannel无需建立链接(远端链接),仍然可以通过isConnect()检测当前channel是否声明了远端链接 地址.
DatagramChannel仍然为线程安全的,read和write阻塞方式类似于其他Channel,即当一个线程正在read,其他尝试进行read的线程将被阻塞.源码参见:http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/nio/ch/DatagramChannelImpl.java.html
- public static DatagramChannel open() throw IOException:打开DatagramChannel,底层通过调用系统级默认SelectorProdiver.openDatagramChannel()来创建通道,但是该通道不会链接.
- public final int validOps():DatagramChannel只支持OP_READ/OP_WRITE两种操作
- public abstract DatagramSocket socket():获取与其关联的底层DatagramSocket.
- public abstract boolean isConnected():检测是否已经建立了Socket链接.
- public abstract DatagramChannel connect(SocketAddress remote):链接remote端.如果当前DatagramSocket资源不存在,则新建(可能是因为此前执行了disconnect方法).向指定的remote地址发送或者接受DatagramPacket.一旦建立链接后(事 实上是本地Socket链接),就无法和任何其他地址进行数据报发送或者接受.(类似于DatagramSocket);底层是类似执行 DatagramSocket.connect(remote)此方法将导致DatagramChannelImpl维持的remoteAddress被复制,此后所有send将会被检测,如果指定的地址remoteAddress地址不同,将会抛出异常.如果想向其他地址send数据,必须disconnect.connect实际上就是创建本地DatagramSocket.
- public abstract DatagramChannel disconnect() throws IOException:断开通道连接,此方法可以在任何时间执行,但是会阻塞后续的read/write,因为此方法对readLock/writeLock对象锁进行同步.此方法主要目的是将connect()方法中指定的remoteAddress置为null,释放底层的Socket.
- public abstract SocketAddress receive(ByteBuffer dst) throws IOException:接收数据报.在非阻塞模式下,此方法可能立即返回,当没有数据可用时,为null,此方法适用于作为"Server"端的DatagramChannel.如果缓冲区中的剩余字节空间小于保存数据报所需的空间,则丢弃余下的数据报。此方法同步readLock.并且支持中断响应:begin()/end()方法.操作之前,需要channel.socket().bind();
- public abstract int send(ByteBuffer src,SocketAddress remote) throws IOException:发送数据.同步writeLock.在非阻塞模式下,此方法可能立即返回0.需要注意,如果在send之前,如果调用了connect(),那么remote地址必须和connect指定的一样,否则将抛出异常.此方法将导致新建DatagramSocket.send操作,在底层最终还是使用了write(ByteBuffer),只不过进行了校验和本地Socket生成策略.在很多情况下,对于被动数据接受方(可以用server端来比喻),通常是receive + send方法.
- public abstract int read(ByteBuffer dst):仅在此套接字已经连接的情况下,才可用(connect()方法);这个有个特殊的要求,如果实际传输的数据size大于byteBuffer,剩余数据将会被抛弃.次方返回读取的字节个数,如果EOF,则返回-1.在非阻塞模式下,有可能返回0.本方法同步readLock.
- public abstract int write(ByteBuffer src) throws IOException:向此通道写入数据,本方法将同步writeLock。此方法必须在connect()之后.如果尚未connect(),则抛出异常.此方法在非阻塞模式下,有可能返回0.对于主动数据发送方(client端),通常操作组合为read + write方法.
相关推荐
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-三个属性和类型.mp4 17-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 NIO API详解 #### 一、引言 在Java早期版本中,I/O操作主要依赖于`java.io`包中的流式API,这些API虽然简单易用,但其本质是阻塞式的,这意味着每次读写操作都会等待直至完成。这种机制在处理大量并发...
### Java NIO 相关知识点详解 #### Java NIO 概述 Java NIO(New IO)是从 Java 1.4 版本开始引入的一种新的 I/O 处理方式,它提供了一种不同于传统 Java IO 的操作模式。NIO 的核心组件包括 Channel(通道)、...
- **DatagramChannel**:用于UDP数据报的发送和接收。 - **SocketChannel**:用于客户端TCP连接的读写操作。 - **ServerSocketChannel**:用于监听并接受客户端的TCP连接请求。 - **Buffers**:Buffers是NIO中的...
### Java NIO 系列教程知识点详解 #### Java NIO 概述 Java NIO (New IO) 是从 Java 1.4 开始提供的一种新的 I/O 处理方式,旨在改进传统 Java IO API 的性能并引入更高效的数据处理机制。Java NIO 主要包括三大...
### Java NIO (New IO) 详解 #### 1. 引言 在Java的世界里,I/O(Input/Output)操作是程序与外部环境进行交互的重要方式之一。随着技术的发展,传统I/O模型逐渐显露出一些局限性,特别是在处理高并发场景下,其...
### Java NIO 详解 #### 一、引言与背景 在Java开发中,网络通信是必不可少的一部分。传统的Java I/O(通常称为BIO或Blocking I/O)在处理大量并发连接时存在一定的性能瓶颈。为了解决这些问题,在JDK 1.4中引入了...
### Java NIO 原理与使用详解 #### 一、Java NIO 概述 在深入了解 Java NIO 的工作原理及其使用之前,我们首先来了解一下什么是 Java NIO(New I/O)。Java NIO 是 Java SE 1.4 版本引入的一个全新的 I/O API,...
- `DatagramChannel` - `Pipe.SinkChannel` - `Pipe.SourceChannel` - **选择器(Selector)**:用于监控多个注册通道上的 I/O 状态变化,当某个通道的状态发生变化时,选择器会通知相应的操作。选择器的主要作用...
Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等。它们可以用于读取或写入数据,并且支持同时读写操作。通道是双向的,可以读也可以写,而传统的流通常是单向的。通道可以与缓冲区...
### Java NIO 教程知识点详解 #### 一、Java NIO 概述 Java NIO(New IO),从 Java 1.4 开始引入,是 Java 标准 IO API 的一个补充,提供了与标准 IO 不同的工作方式。Java NIO 的主要特性包括: 1. **基于通道...
Java NIO 概述与实现详解 Java NIO(New IO 或 Non Blocking IO)是从 Java 1.4 版本开始引入的一个新的IO API,可以替代标准的 Java IO API。NIO 支持面向缓冲区的、基于通道的 IO 操作。NIO 将以更加高效的方式...
《Java NIO详解》 Java NIO(Non-Blocking Input/Output)是Java在1.4版本引入的新I/O模型,是对传统BIO(Blocking I/O)模型的一种扩展和优化。NIO的主要特点是其非阻塞特性,允许程序在等待数据准备就绪时进行...
- **DatagramChannel**:用于UDP数据包的发送和接收。 - **ServerSocketChannel**:用于创建服务器端点,接受客户端连接。 #### 五、NIO应用示例 下面是一个简单的NIO文件复制示例,演示如何使用Buffer和Channel来...
常见的Channel有FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel,分别对应于文件操作、UDP网络通信、TCP网络通信和监听TCP连接。Buffer是一个可以存储特定类型数据的区域,例如ByteBuffer、...
在 Java NIO 中,Select 和 Channel 是两个核心概念,本文将详解 Java NIO 中的 Select 和 Channel。 什么是 Channel? Channel 是 Java NIO 中的基本概念,它是一种可读可写的流对象,与传统的流不同,Channel ...