package cn.bunny.service.netty.demo1;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class StartServer01 {
    /*
        服务器端处理内容
     */
    public static void main(String[] args) {
        // 启动器
        new ServerBootstrap()
                // 添加组件 NioEventLoopGroup WorkerEventLoop
                .group(new NioEventLoopGroup())
                // 选择 ServerNio 实现，还支持某种Linux的实现
                .channel(NioServerSocketChannel.class)
                // 处理字节进行分工，需要处理哪些逻辑，决定了 child可以执行哪些操作
                .childHandler(
                        // 代码客户端读写通道 添加别的 handler
                        new ChannelInitializer<NioSocketChannel>() {
                            @Override
                            protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
                                // 添加解码，将传输过来的 ByteBuffer 转为字符串
                                nioSocketChannel.pipeline().addLast(new StringDecoder());
                                // 自定处理器
                                nioSocketChannel.pipeline().addLast(new ChannelInboundHandlerAdapter() {
                                    // 发生读事件
                                    @Override
                                    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                                        // 打印上一步转化好的字符串
                                        System.out.println(STR."消息为\{msg}");
                                        log.debug("消息：{}", msg);
                                    }
                                });
                            }
                        })
                // 绑定端口
                .bind(8080);
    }
}
