原文链接 作者:Jakob Jenkov 译者:郑玉婷 校对:丁一
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:
- 打开一个SocketChannel并连接到互联网上的某台服务器。
- 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。
打开 SocketChannel
下面是SocketChannel的打开方式:
1 |
SocketChannel socketChannel = SocketChannel.open(); |
关闭 SocketChannel
当用完SocketChannel之后调用SocketChannel.close()关闭SocketChannel:
从 SocketChannel 读取数据
要从SocketChannel中读取数据,调用一个read()的方法之一。以下是例子:
1 |
ByteBuffer buf = ByteBuffer.allocate( 48 );
|
2 |
int bytesRead = socketChannel.read(buf);
|
首先,分配一个Buffer。从SocketChannel读取到的数据将会放到这个Buffer中。
然后,调用SocketChannel.read()。该方法将数据从SocketChannel 读到Buffer中。read()方法返回的int值表示读了多少字节进Buffer里。如果返回的是-1,表示已经读到了流的末尾(连接关闭了)。
写入 SocketChannel
写数据到SocketChannel用的是SocketChannel.write()方法,该方法以一个Buffer作为参数。示例如下:
01 |
String newData = "New String to write to file..." + System.currentTimeMillis();
|
03 |
ByteBuffer buf = ByteBuffer.allocate( 48 );
|
05 |
buf.put(newData.getBytes()); |
09 |
while (buf.hasRemaining()) {
|
注意SocketChannel.write()方法的调用是在一个while循环中的。Write()方法无法保证能写多少字节到SocketChannel。所以,我们重复调用write()直到Buffer没有要写的字节为止。
非阻塞模式
可以设置 SocketChannel 为非阻塞模式(non-blocking mode).设置之后,就可以在异步模式下调用connect(), read() 和write()了。
connect()
如果SocketChannel在非阻塞模式下,此时调用connect(),该方法可能在连接建立之前就返回了。为了确定连接是否建立,可以调用finishConnect()的方法。像这样:
1 |
socketChannel.configureBlocking( false );
|
4 |
while (! socketChannel.finishConnect() ){
|
write()
非阻塞模式下,write()方法在尚未写出任何内容时可能就返回了。所以需要在循环中调用write()。前面已经有例子了,这里就不赘述了。
read()
非阻塞模式下,read()方法在尚未读取到任何数据时可能就返回了。所以需要关注它的int返回值,它会告诉你读取了多少字节。
非阻塞模式与选择器
非阻塞模式与选择器搭配会工作的更好,通过将一或多个SocketChannel注册到Selector,可以询问选择器哪个通道已经准备好了读取,写入等。Selector与SocketChannel的搭配使用会在后面详讲。
分享到:
相关推荐
Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO系列教程(十) Java NIO DatagramChannel Java NIO系列教程(十一) Pipe Java NIO系列教程(十二) Java NIO与IO
### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...
### Java NIO 系列教程知识点详解 #### Java NIO 概述 Java NIO (New IO) 是从 Java 1.4 开始提供的一种新的 I/O 处理方式,旨在改进传统 Java IO API 的性能并引入更高效的数据处理机制。Java NIO 主要包括三大...
Java NIO中的主要通道包括FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel,分别对应文件操作、UDP网络通信、TCP网络通信和服务器端的TCP连接。 4. **缓冲区(Buffer)** Java NIO提供了多种...
### Java NIO 系列教程知识点详解 #### 一、Java NIO 概述 Java NIO (New IO) 是 Java SE 1.4 版本引入的一种新的输入/输出方式,它提供了一种替代传统的 Java IO 包的方式。Java NIO 主要包括三个核心组成部分:*...
本文档旨在为Java程序员提供一个全面深入理解NIO库的教程,不仅涵盖了概念性的高级知识,还包括了底层编程细节。 #### 二、NIO概述 ##### 2.1 历史背景 - **原生I/O**:Java最初提供的I/O操作是基于流的,这在处理...
- **主要类型**:Java NIO支持多种类型的通道,如`FileChannel`、`DatagramChannel`、`SocketChannel`等。 - **操作方式**:通过`read()`和`write()`方法实现数据的读取和写入。这些方法都是非阻塞的,这意味着它们...
文件名称列表中,我们看到有多个以"Master Merlin's new I-O classes - JavaWorld-"开头的文章,这可能是一个系列教程,由Master Merlin这位专家在JavaWorld网站上发表,探讨了Java NIO的新特性。此外,还有"DANCE ...
- **参考资料**:本教程提供了一系列的代码示例,每个示例都是完整的 Java 程序的一部分,可以帮助读者更深入地理解 NIO 的各个组件。 - **代码下载与运行**:建议读者下载并运行这些代码示例,以加深对 NIO 概念的...
`java.hearing3oc`可能是指一个特定的教程系列或者代码示例集合,用于教授Java NIO的相关知识,`扣弄你澳大`这部分可能是误输入或者某种特定的表述,不直接影响知识点的解释。 通道接口包括以下常见的实现类: - *...
JDK 1.4还引入了一系列新的APIs和特性,如`java.nio.channels.spi.AbstractInterruptibleChannel`,`java.nio.channels.spi.AbstractSelectableChannel`,`java.nio.charset.StandardCharsets`等,这些APIs丰富了...
《Netty源码深入分析》是由美团基础架构部的闪电侠老师所分享的一系列关于Netty源码解析的视频教程。以下将根据标题、描述、标签以及部分内容等信息,对Netty及其源码进行深入剖析。 ### Netty简介 Netty是基于...
1. **BossGroup和WorkerGroup**:Netty使用NIO模型,BossGroup负责接受新的连接,而WorkerGroup处理已连接的SocketChannel上的读写事件,这种分离提高了系统的并发处理能力。 2. **Channel**:Channel代表一个网络...
- `Channel`有多种实现,如`NioServerSocketChannel`、`NioSocketChannel`等,选择合适的`Channel`类型对于性能至关重要。 3. **EventLoop**与**EventLoopGroup**: - `EventLoop`:负责处理一系列`Channel`的...
Netty 是一款广泛应用于高性能网络应用开发的异步事件驱动的 Java 开源框架。它为开发者提供了强大的工具来构建可扩展、高效且易于维护的网络服务器和客户端。 **Netty 主要特点包括:** 1. **统一的 API 设计**:...