10.处理write写事件

@Slf4j
public class NioServer {

    public static void main(String[] args) throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.configureBlocking(false);
        Selector selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        serverSocketChannel.bind(new InetSocketAddress(8000));
        while (true) {
            selector.select();
            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
            if(iterator.hasNext()) {
                SelectionKey selectionKey = iterator.next();
                iterator.remove();
                //与客户端建立连接
                if(selectionKey.isAcceptable()) {
                    //因为ServerSocketChannel只有一个,可以直接使用
                    SocketChannel socketChannel = serverSocketChannel.accept();
                    socketChannel.configureBlocking(false);
                    SelectionKey acceptKey = socketChannel.register(selector, 0, null);
                    acceptKey.interestOps(SelectionKey.OP_READ);

                    //向客户端发大量数据
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < 5000000; i++) {
                        sb.append("a");
                    }
                    ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(sb.toString());

                    //返回实际写的字节数
                    int write = socketChannel.write(byteBuffer);
                    log.info("write1={}", write);
                    if(byteBuffer.hasRemaining()) {
                        //添加关注写事件
                        acceptKey.interestOps(acceptKey.interestOps() + SelectionKey.OP_WRITE);
                        //把未写完的数据挂到selectKey上
                        acceptKey.attach(byteBuffer);
                    }
                } else if(selectionKey.isWritable()) {
                    ByteBuffer byteBuffer = (ByteBuffer)selectionKey.attachment();
                    SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
                    int write = socketChannel.write(byteBuffer);
                    log.info("write2={}", write);
                    //清理操作
                    if(!byteBuffer.hasRemaining()) {
                        selectionKey.attach(null);//清除附件ByteBuffer
                        //不需要关注write事件
                        selectionKey.interestOps(selectionKey.interestOps() - SelectionKey.OP_WRITE);
                    }
                }
            }
        }
    }
}
@Slf4j
public class NioClient {

    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress("localhost", 8000));

        long totalCount = 0;
        while (true) {
            ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024 * 1024);
            int read = socketChannel.read(byteBuffer);
            totalCount += read;
            log.info("totalCount={}", totalCount);
            byteBuffer.clear();
        }
    }
}

相关推荐

  1. React@16.x(19事件处理

    2024-04-05 11:32:05       11 阅读
  2. flutter学习-day14-事件处理和通知

    2024-04-05 11:32:05       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-05 11:32:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-05 11:32:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-05 11:32:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-05 11:32:05       20 阅读

热门阅读

  1. 数据库更新两张相关联的表

    2024-04-05 11:32:05       15 阅读
  2. 【leetcode】向字符串添加空格

    2024-04-05 11:32:05       15 阅读
  3. 2024.3.17力扣每日一题——最小高度树

    2024-04-05 11:32:05       13 阅读
  4. Apache Spark 的基本概念和在大数据分析中的应用

    2024-04-05 11:32:05       14 阅读
  5. WPF如何使用 System.Windows.Forms.FolderBrowserDialog

    2024-04-05 11:32:05       16 阅读
  6. 找出字符串中所有偶数的个数

    2024-04-05 11:32:05       15 阅读
  7. 单例模式的多种写法

    2024-04-05 11:32:05       13 阅读
  8. 设计模式:单例模式六种实现

    2024-04-05 11:32:05       19 阅读
  9. 单例模式详解

    2024-04-05 11:32:05       13 阅读
  10. Visual Studio Code(VS Code)安装教程

    2024-04-05 11:32:05       12 阅读
  11. Vue 组件的 mixin 函数,用于屏幕适配

    2024-04-05 11:32:05       13 阅读
  12. 0基础如何进入IT行业

    2024-04-05 11:32:05       15 阅读
  13. C/C++中的static关键字用法总结

    2024-04-05 11:32:05       19 阅读
  14. 梯度反向传播过程是如何处理repeat函数的

    2024-04-05 11:32:05       13 阅读
  15. linux小工具杂记

    2024-04-05 11:32:05       19 阅读