NIO笔记(五)之NIO各种事件

NIO各种事件

  1. 客户端的SocketChannel支持 OP_CONNECT, OP_READ, OP_WRITE三个操作。服务端ServerSocketChannel只支持OP_ACCEPT操作,在服务端由ServerSocketChannelaccept()方法产生的SocketChannel只支持OP_READ, OP_WRITE操作。

    client/Server SocketChannel/ServerSocketChannel OP_ACCEPT OP_CONNECT OP_WRITE OP_READ
    client SocketChannel Y Y Y
    server ServerSocketChannel Y
    server SocketChannel Y Y
  2. 就绪条件

    • OP_ACCEPT就绪条件:当收到一个客户端的连接请求时,该操作就绪。这是ServerSocketChannel上唯一有效的操作。
    • OP_CONNECT就绪条件:只有客户端SocketChannel会注册该操作,当客户端调用SocketChannel.connect()时,该操作会就绪。
    • OP_READ就绪条件:该操作对客户端和服务端的SocketChannel都有效,当OS的读缓冲区中有数据可读时,该操作就绪。
    • OP_WRITE就绪条件:该操作对客户端和服务端的SocketChannel都有效,当OS的写缓冲区中有空闲的空间时(大部分时候都有),该操作就绪。

OP_CONNECT

  1. 客户端调用connect()并注册OP_CONNECT事件后,连接操作就会就绪,但是连接就绪不代表连接成功。OP_CONNECT底层本质上是Write

    SocketChannel channel = SocketChannel.open();
    channel.configureBlocking(false);
    channel.connect(addr);
    channel.register(selector, SelectionKey.OP_CONNECT);
    
    //判断连接就绪,通过`finishConnect()`判断
    if (key.isValid() && key.isConnectable()) {
         
         
       SocketChannel ch = (SocketChannel) key.channel();
       if (ch.finishConnect()) {
         
         
           // Connect successfully
           // key.interestOps(SelectionKey.OP_READ);
       } else {
         
         
           // Connect failed
       }
    }
    

OP_ACCEPT

  1. OP_ACCEPT的处理与OP_CONNECT基本一样,服务端监听,并注册OP_ACCEPT事件后,就已准备好接受客户端的连接了

    ServerSocketChannel ssc = ServerSocketChannel.open();
    ssc.configureBlocking(false);
    ssc.socket().bind(new InetSocketAddress(port));
    channel.register(selector, SelectionKey.OP_ACCEPT);
    
    if (key.isValid() && key.isAcceptable()) {
         
         
       ServerSocketChannel ssc = (ServerSocketChannel) key.chan
### 关于尚硅谷 Java NIO 学习笔记或 PDF 的查找 目前,尚未提供具体的尚硅谷 Java NIO 学习笔记或 PDF 文件的相关链接。然而,可以通过以下方式获取相关资源: 1. **官方渠道** 尚硅谷作为一家知名的 IT 教育机构,通常会在其官方网站或其他授权平台上发布课程资料。建议访问尚硅谷官网,搜索与 Java NIO 相关的课程,并下载配套的学习资料[^1]。 2. **第三方平台** 许多教育分享网站可能提供了尚硅谷的 Java NIO 学习笔记或视频教程。可以在诸如 优快云、GitHub 或者百度网盘等平台上尝试搜索关键词“尚硅谷 Java NIO”,找到对应的 PDF 或其他格式的文档[^2]。 3. **核心知识点总结** 如果暂时无法获得完整的 PDF 资料,以下是基于 Java NIO 的基础知识整理,供参考: #### 什么是 NIO? Java NIO 是 New IO 的缩写,它是从 JDK 1.4 版本开始引入的一套新的 I/O API。相比传统 I/O,Java NIO 提供了更高效的非阻塞模式以及缓冲区机制。它主要包括以下几个部分: - Buffer(缓冲区) - Channel(通道) - Selector(选择器) #### 核心组件详解 - **Buffer**: 数据容器,用于存储不同类型的字节数据。常用的方法包括 `flip()`、`clear()` 和 `rewind()`. 使用时需注意缓冲区的状态管理[^5]。 ```java ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put((byte) 'A'); buffer.flip(); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } ``` - **Channel**: 类似于流的概念,但支持双向读写操作。常见实现包括 `FileChannel` 和 `SocketChannel`. ```java try (RandomAccessFile file = new RandomAccessFile("example.txt", "rw"); FileChannel channel = file.getChannel()) { ByteBuffer buf = ByteBuffer.allocate(1024); int bytesRead = channel.read(buf); // 从通道读取数据到缓冲区 buf.flip(); // 切换为读模式 while (buf.hasRemaining()) { System.out.print((char) buf.get()); } } catch (IOException e) { e.printStackTrace(); } ``` - **Selector**: 多路复用的关键工具,允许单线程处理多个 Channel。适用于高并发场景中的网络通信[^4]. #### 如何验证学习效果? 通过编写简单的代码测试对 NIO 的理解程度。例如,利用 `FileChannel` 实现文件拷贝功能: ```java import java.io.*; import java.nio.channels.FileChannel; public class FileCopyExample { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("source.txt"); FileOutputStream fos = new FileOutputStream("destination.txt"); FileChannel sourceChannel = fis.getChannel(); FileChannel destChannel = fos.getChannel(); long bytesTransferred = sourceChannel.transferTo(0, sourceChannel.size(), destChannel); sourceChannel.close(); destChannel.close(); fis.close(); fos.close(); System.out.println(bytesTransferred + " bytes copied."); } } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值