`

【Java NIO 简例】SocketChannel

    博客分类:
  • Java
nio 
阅读更多

原文:《Java NIO SocketChannel

Java NIO 中的 SocketChannel 用于处理 TCP 网络连接。

 

开启 SocketChannel

示例:连接远程服务器

SocketChannel channel = SocketChannel.open();
channel.connect(new InetSocketAddress("abc.xyz", 80));

ServerSocketChannel.accept() 方法也会返回SocketChannel实例。那属于服务端的操作,将在ServerSocketChannel 中说明。

 

关闭 SocketChannel

可直接调用 SocketChannel.close() 方法关闭,也可以 try-with-resources 的方式关闭。

channel.close();

 

读取 SocketChannel 中的数据

可调用 SocketChannel 的 read(ByteBuffer) 方法将数据从channel的当前位置开始,读取到buffer中。

如果返回值为 -1,则表示已读到数据流末尾。

ByteBuffer buffer = ByteBuffer.allocate(1024);
int readByteCount = channel.read(buffer);

 

其它方法:read(ByteBuffer[]) 和 read(ByteBuffer[], int, int) 属于 ScatteringByteChannel 的 数据分散 特性。

 

向 SocketChannel 写数据

可调用 SocketChannel 的 write(ByteBuffer) 方法,将 buffer 当前位置 开始的数据写入 channel。

返回值表示本次写入channel的字节数,可能为0。所以需要放在while循环中,确保buffer中所有数据都被写入channel。

// byte[] data = ...
ByteBuffer buffer = ByteBuffer.allocate(data.length);
buffer.put(data);
buffer.flip();
while (buffer.hasRemaining()) {
  channel.write(buffer);
}

 

其它方法:write(ByteBuffer[]) 和 write(ByteBuffer[], int, int) 属于 GatheringByteChannel 的 数据聚集 特性。

 

非阻塞模式

在非阻塞模式下,SocketChannel 的 connect()、write()、read() 方法都会以异步的模式工作。
即:

  • connect() 方法返回时,连接可能尚未建立;
  • write() 方法返回时,数据可能未写入 channel(其实阻塞模式下也可能未写完);
  • read() 方法返回时,可能未读到数据。

所以需要通过 SocketChannel.finishConnect() 方法判断是否已建立连接;判断 read() 返回的值是否大于0

channel.configureBlocking(false); // 将channel设置为 非阻塞模式
channel.connect(new InetSocketAddress("abc.xyz", 80));

// 等待连接
while (!channel.finishConnect()) {
  // 连接尚未建立,可以做其它事
}

// 连接已建立

 

此外,非阻塞模式的 SocketChannel 更适合与 Selector 搭配使用

分享到:
评论

相关推荐

    JavaNIO chm帮助文档

    Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO系列教程(十) Java NIO DatagramChannel Java NIO系列教程(十一) Pipe Java NIO系列教程(十二) Java NIO与IO

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    java NIO.zip

    Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道(ServerSocketChannel)等。通道可以同时进行读写操作,并且可以实现异步读写。 2. **缓冲区(Buffers...

    Java NIO英文高清原版

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据...

    java NIO技巧及原理

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...

    java NIO实例

    Java NIO提供了一些常见的通道实现,如SocketChannel(用于网络通信)、FileChannel(用于文件操作)等。 3. **Buffer(缓冲区)**:在NIO中,数据读写都是通过缓冲区进行的。缓冲区是一个可以容纳特定类型数据(如...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    一个java NIO的例子

    Java NIO提供了多种类型的通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel用于网络通信,DatagramChannel用于UDP通信。通道可以进行读写操作,并且是非阻塞的,这意味着如果数据未准备好,...

    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 Socket基本

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...

    java nio入门学习,两个pdf

    Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于文件、套接字和UDP通信。 2. **缓冲区(Buffers)**:缓冲区是存储数据的主要对象,所有的I/O操作都是通过缓冲区进行的...

    java NIO详细教程

    ### Java NIO 详细教程知识点解析 #### 一、Java NIO 概述 Java NIO(New IO)是Java平台提供的一种新的IO操作模式,它首次出现在Java 1.4版本中,并在后续版本中不断完善。Java NIO 的设计目的是为了克服传统Java ...

    java nio 实现socket

    ### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...

    Java NIO 中英文版

    - Java NIO支持通道间的直接数据传输,例如可以从一个FileChannel直接将数据传输到SocketChannel,无需经过缓冲区,减少了数据复制的开销。 6. **异步I/O** - Java NIO还提供了异步I/O操作,通过...

Global site tag (gtag.js) - Google Analytics