• 利用netty简单实现聊天室


    1.导入依赖包

            <dependency>
                <groupId>io.netty</groupId>
                <artifactId>netty-all</artifactId>
                <version>5.0.0.Alpha1</version>
            </dependency>

    2.netty服务端代码

    复制代码
    public class NettyServer {
        public static void main(String[] args) {
             EventLoopGroup bossGroup = new NioEventLoopGroup();
             EventLoopGroup workGroup = new NioEventLoopGroup();
             ServerBootstrap bootStrap = new ServerBootstrap();
                ChannelFuture cf;
                bootStrap.group(bossGroup,workGroup)
                        .channel(NioServerSocketChannel.class)
                        .option(ChannelOption.SO_BACKLOG, 1024)
                        .childHandler(new ChannelInitializer<SocketChannel>() {
                            @Override
                            public void initChannel(SocketChannel ch) throws Exception {
                                ChannelPipeline p = ch.pipeline();
                                p.addLast("decoder", new StringDecoder());//需要编解码,否则无法解析
                                p.addLast("encoder", new StringEncoder());
                                p.addLast(new NettyServerHandler());
                            }
                        });
    
                try {
                    cf =  bootStrap.bind(8099).sync();//监听8099端口
                    System.out.println("8099:binded...");
                    cf.channel().closeFuture().sync();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally{
                    bossGroup.shutdownGracefully();
                    workGroup.shutdownGracefully();
                }
        }
    }
    复制代码

    3.netty客户端代码

    复制代码
    public class NettyClient {
        public static void main(String[] args) throws Exception {
            EventLoopGroup group =new NioEventLoopGroup();
            try {
                Bootstrap b = new Bootstrap();
                b.group(group)
                        .channel(NioSocketChannel.class)
                        .option(ChannelOption.TCP_NODELAY, true)
                        .handler(new ChannelInitializer<SocketChannel>(){
                            @Override
                            public void initChannel(SocketChannel ch) throws Exception {
                                ChannelPipeline p = ch.pipeline();
                                p.addLast("decoder", new StringDecoder());
                                p.addLast("encoder", new StringEncoder());
                                p.addLast(new ClientHandler());
                                p.addLast(new ClientHandlerBak());
                            }
                        });
    
                ChannelFuture future = b.connect("127.0.0.1", 8099).sync();
                future.channel().writeAndFlush("这里是客户端,请求连接服务端!");
                future.channel().closeFuture().sync();
            } finally {
                group.shutdownGracefully();
            }
    
        }
    }
    复制代码

    4.服务端处理类

    复制代码
    public class NettyServerHandler extends ChannelHandlerAdapter {
    
        //有客户端连接时触发
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            System.out.println("one client connect...");
        }
    
        //断开连接时触发
        @Override
        public void channelInactive(ChannelHandlerContext ctx) throws Exception {
            System.out.println("one client disconnect...");
        }
    
        //接收客户端发送的消息
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            System.out.println("客户端:"+msg.toString());
            InputStreamReader is = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(is);
            String result ="result";
            try{
                result = br.readLine();
            }
            catch(IOException e){
                e.printStackTrace();
            }
            ctx.write(result);//给客户端回复
            ctx.flush();
        }
    }
    复制代码

    5.客户端处理类

    复制代码
    public class ClientHandler extends ChannelHandlerAdapter {
    
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            System.out.println("Client01Handler Active");
            /*若把这一句注释掉将无法将event传递给下一个ClientHandler,例如例子中p.addLast(new Client01Handler())后面紧跟着p.addLast(new Client02Handler())
             后面的Client02Handler里的方法就不会被触发。
            */
            ctx.fireChannelActive();
        }
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            System.out.println("服务端: "+msg);
            InputStreamReader is = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(is);
            String result ="result";
            try{
                result = br.readLine();
            }
            catch(IOException e){
                e.printStackTrace();
            }
            ctx.write(result);//给服务端回复
            ctx.flush();
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            cause.printStackTrace();
            ctx.close();
        }
    }
    复制代码

    6.最后,看看效果,先启动服务端,再启动客户端

  • 相关阅读:
    ngx-bootstrap使用04 carousel组件
    ngx-bootstrap使用03 Alerts组件、利用Object.assign复制对象
    ngx-bootstrap使用02 Accordion组件的使用
    ngx-bootstrap使用01 安装ngx-bootstrap和bootstrap及其使用、外部样式引入
    SpringBoot11 读取properties文件、发送邮件
    SpringBoot10 整合JSP
    SpringBoot09 自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题
    红帽系统制作yum本地源
    利用python数据分析panda学习笔记之基本功能
    利用python数据分析panda学习笔记之DataFrame
  • 原文地址:https://www.cnblogs.com/tinyj/p/10122952.html
Copyright © 2020-2023  润新知