zoukankan      html  css  js  c++  java
  • Netty简单聊天室

    1、创建maven项目,在pom.xml中引入netty的jar包

    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.cppdy</groupId>
        <artifactId>NettyDemo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>io.netty</groupId>
                <artifactId>netty-all</artifactId>
                <version>4.1.32.Final</version>
            </dependency>
        </dependencies>
    
    </project>

    2、创建server处理程序类

    package com.cppdy.server;
    
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    
    public class ChatServerHandler extends SimpleChannelInboundHandler<String>{
    
        @Override
        protected void channelRead0(ChannelHandlerContext arg0, String msg) throws Exception {
            
            System.out.println(msg);
        }
    
    }

    3、创建server初始化类

    package com.cppdy.server;
    
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelPipeline;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.handler.codec.string.StringDecoder;
    import io.netty.handler.codec.string.StringEncoder;
    
    public class ChatServerInit extends ChannelInitializer<SocketChannel>{
    
        @Override
        protected void initChannel(SocketChannel sc) throws Exception {
            
            ChannelPipeline pipeline = sc.pipeline();
            pipeline.addLast("decoder",new StringDecoder());
            pipeline.addLast("encoder",new StringEncoder());
            pipeline.addLast("handler",new ChatServerHandler());
        }
    
    }

    4、创建server启动类

    package com.cppdy.server;
    
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelOption;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.nio.NioServerSocketChannel;
    
    public class ChatServer {
    
        public static void main(String[] args) {
            NioEventLoopGroup boss = new NioEventLoopGroup();
            NioEventLoopGroup worker = new NioEventLoopGroup();
    
            try {
                ServerBootstrap b = new ServerBootstrap();
                b.group(boss, worker).channel(NioServerSocketChannel.class).childHandler(new ChatServerInit())
                        .option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);
    
                System.out.println("服务端启动啦……");
    
                ChannelFuture sync = b.bind(8080).sync();
                sync.channel().closeFuture().sync();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                boss.shutdownGracefully();
                worker.shutdownGracefully();
            }
        }
    }

    5、创建client处理程序类

    package com.cppdy.client;
    
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    
    public class ChatClientHandler extends SimpleChannelInboundHandler<String> {
    
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
            
            System.out.println(msg);
        }
    
    }

    6、创建client初始化类

    package com.cppdy.client;
    
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.ChannelPipeline;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.handler.codec.string.StringDecoder;
    import io.netty.handler.codec.string.StringEncoder;
    
    public class ChatClientInit extends ChannelInitializer<SocketChannel> {
    
        @Override
        protected void initChannel(SocketChannel sc) throws Exception {
    
            ChannelPipeline pipeline = sc.pipeline();
            pipeline.addLast("decoder", new StringDecoder());
            pipeline.addLast("encoder", new StringEncoder());
            pipeline.addLast("handler", new ChatClientHandler());
    
        }
    
    }

    7、创建client启动类

    package com.cppdy.client;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.InetSocketAddress;
    
    import io.netty.bootstrap.Bootstrap;
    import io.netty.channel.Channel;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.nio.NioSocketChannel;
    
    public class ChatClient {
    
        public static void main(String[] args) {
            NioEventLoopGroup group = new NioEventLoopGroup();
            try {
                Bootstrap bootstrap = new Bootstrap().group(group).channel(NioSocketChannel.class)
                        .handler(new ChatClientInit());
                Channel channel = bootstrap.connect(new InetSocketAddress("127.0.0.1", 8080)).sync().channel();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
                while (true) {
                    channel.writeAndFlush(bufferedReader.readLine() + "
    ");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                group.shutdownGracefully();
            }
        }
    }

    8、先启动ChatServer类,再启动ChatClient类,就可以模拟发送消息功能。

  • 相关阅读:
    奔跑吧DKY——团队Scrum冲刺阶段-Day 3
    奔跑吧DKY——团队Scrum冲刺阶段-Day 2
    奔跑吧DKY——团队Scrum冲刺阶段博客汇总
    奔跑吧DKY——团队Scrum冲刺阶段-Day 1-领航
    哈夫曼编码的实现
    电子政务作业——我为政府网站纠错
    20172309 2018-2019《程序设计与数据结构》课程总结
    # Do—Now——团队冲刺博客_总结篇
    数据结构之哈夫曼树
    关于在ViewPager的子页面中不能跳转的问题
  • 原文地址:https://www.cnblogs.com/jiefu/p/10046911.html
Copyright © 2011-2022 走看看