package cn.bunny.file_dir;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Iterator;

@Slf4j
public class ServerDemo {
    // 阻塞模式下只能接受一个连接
    public static void main(String[] args) throws IOException {
        // 创建Selector
        Selector selector = Selector.open();

        // 创建服务器
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.configureBlocking(false);
        SelectionKey selectionKey = serverSocketChannel.register(selector, 0, null);

        // 只关注channel时间
        selectionKey.interestOps(SelectionKey.OP_ACCEPT);
        System.out.println(STR."注册时的key:\{selectionKey}");

        // 模拟监听端口
        serverSocketChannel.bind(new InetSocketAddress(8080));

        while (true) {
            selector.select();
            // 处理事件
            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
            while (iterator.hasNext()) {
                SelectionKey key = iterator.next();
                System.out.println(STR."key的值为\{key}");
                ServerSocketChannel channel = (ServerSocketChannel) key.channel();
                SocketChannel accept = channel.accept();
                System.out.println(STR."接受到的值\{accept}");
            }
        }
    }

    private static void m1() throws IOException {
        // 使用 ByteBuffer
        ByteBuffer buffer = ByteBuffer.allocate(16);
        // 创建服务器
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.configureBlocking(false);
        // 模拟监听端口
        serverSocketChannel.bind(new InetSocketAddress(8080));
        // 连接集合
        ArrayList<SocketChannel> channels = new ArrayList<>();
        while (true) {
            SocketChannel accept = serverSocketChannel.accept();
            if (accept != null) {
                accept.configureBlocking(false);
                channels.add(accept);
            }
            for (SocketChannel channel : channels) {
                int read = channel.read(buffer);
                // 当read大于0时才去读
                if (read > 0) {
                    buffer.flip();
                    System.out.println((STR."读取到的内容：\{StandardCharsets.UTF_8.decode(buffer)}"));
                    buffer.clear();
                }
            }
        }
    }
}
