package org.example;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

import java.io.BufferedReader;
import java.io.InputStreamReader;

// 客户端:
public class MultiChatClient {
    private final String host;
    private final int port;
    private ChannelHandlerContext ctx;

    // 构造函数,初始化主机和端口
    public MultiChatClient(String host, int port) {
        this.host = host;
        this.port = port;
    }

    // 客户端运行方法
    public void run() throws Exception {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
                    .channel(NioSocketChannel.class)
                    .option(ChannelOption.SO_KEEPALIVE, true)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            // 添加解码器和编码器,以及客户端处理程序
                            ch.pipeline().addLast(new StringDecoder(), new StringEncoder(), new MultiChatClientHandler());
                        }
                    });
             // 连接到服务器
            ChannelFuture f = b.connect(host, port).sync();
            ctx = f.channel().pipeline().context(MultiChatClientHandler.class);
            // 从控制台读取输入,并将其发送到服务器
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                String line = in.readLine();
                if (line == null) {
                    break;
                }
                if (line.equals('LIST')) {
                    String username = null;
                    ctx.writeAndFlush(line + '|' + username + '\n');
                } else {
                    ctx.writeAndFlush(line + '\n');
                }
            }
             /*
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                String line = in.readLine();
                if (line == null) {
                    break;
                }
                ctx.writeAndFlush(line + '\n');
            }


              */

        } finally {
            // 关闭事件循环组
            group.shutdownGracefully();
        }
    }

    // 主方法,创建客户端实例并运行
    public static void main(String[] args) throws Exception {
        String host = 'localhost';
        int port = 8080;
        new MultiChatClient(host, port).run();
    }
}

// 该代码是一个使用Netty框架实现的多人聊天室的客户端。

// 1. 导入所需的包。

// 2. 创建一个名为MultiChatClient的类。

// 3. 定义主机和端口变量。

// 4. 创建构造函数,用于初始化主机和端口。

// 5. 创建一个run()方法,用于启动客户端。

// 6. 创建一个NioEventLoopGroup对象,用于处理事件的循环。

// 7. 创建一个Bootstrap对象,用于配置和启动客户端。

// 8. 配置Bootstrap对象,设置主机和端口,以及一些选项。

// 9. 创建一个ChannelInitializer对象,用于初始化SocketChannel。

// 10. 在ChannelInitializer的initChannel()方法中,添加解码器、编码器和客户端处理程序。

// 11. 连接到服务器,获取ChannelFuture对象。

// 12. 从ChannelFuture对象中获取ChannelHandlerContext对象。

// 13. 创建一个BufferedReader对象,用于从控制台读取输入。

// 14. 使用while循环,从控制台读取输入,并将其发送到服务器。

// 15. 如果输入的内容是'LIST',则发送'LIST|用户名'到服务器。

// 16. 如果输入的内容不是'LIST',则直接发送到服务器。

// 17. 在循环结束后,关闭事件循环组。

// 18. 创建一个main()方法,用于创建客户端实例并运行。

// 19. 设置主机和端口。

// 20. 创建一个MultiChatClient对象,并调用run()方法启动客户端。

// 这段代码实现了一个基本的多人聊天室客户端,用户可以通过控制台输入消息,并将其发送到服务器。

原文地址: https://www.cveoy.top/t/topic/f3Ef 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录