美文网首页Netty互联网科技
netty案例,netty4.1基础入门篇八《NettyClie

netty案例,netty4.1基础入门篇八《NettyClie

作者: bugstack虫洞栈 | 来源:发表于2019-08-17 21:53 被阅读2次

    前言介绍

    Netty开发中,客户端与服务端需要保持同样的;半包粘包处理,编码解码处理、收发数据方式,这样才能保证数据通信正常。在前面NettyServer的章节中我们也同样处理了;半包粘包、编码解码等,为此在本章节我们可以把这些知识模块开发到NettyClient中。本章节涉及到的知识点有;LineBasedFrameDecoder、StringDecoder、StringEncoder、ChannelInboundHandlerAdapter等。

    开发环境

    1、jdk1.8【jdk1.7以下只能部分支持netty】
    2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】
    3、telnet 测试【可以现在你的win7机器上测试这个命令,用于链接到服务端的测试命令】

    代码示例

    itstack-demo-netty-1-08
    └── src
        ├── main
        │   └── java
        │       └── org.itstack.demo.netty.client
        │           ├── MyChannelInitializer.java
        │           ├── MyClientHandler.java
        │           └── NettyClient.java
        └── test
             └── java
                 └── org.itstack.demo.netty.test
                     └── ApiTest.java
    

    MyChannelInitializer.java

    /**
     * 虫洞栈:https://bugstack.cn
     * 公众号:bugstack虫洞栈  {获取学习源码}
     * Create by fuzhengwei on 2019
     */
    public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {
    
        @Override
        protected void initChannel(SocketChannel channel) throws Exception {
            // 基于换行符号
            channel.pipeline().addLast(new LineBasedFrameDecoder(1024));
            // 解码转String,注意调整自己的编码格式GBK、UTF-8
            channel.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));
            // 解码转String,注意调整自己的编码格式GBK、UTF-8
            channel.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));
            // 在管道中添加我们自己的接收数据实现方法
            channel.pipeline().addLast(new MyClientHandler());
        }
    
    }
    

    MyClientHandler.java

    /**
     * 虫洞栈:https://bugstack.cn
     * 公众号:bugstack虫洞栈  {获取学习源码}
     * Create by fuzhengwei on 2019
     */
    public class MyClientHandler extends ChannelInboundHandlerAdapter {
    
        /**
         * 当客户端主动链接服务端的链接后,这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据
         */
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            SocketChannel channel = (SocketChannel) ctx.channel();
            System.out.println("链接报告开始");
            System.out.println("链接报告信息:本客户端链接到服务端。channelId:" + channel.id());
            System.out.println("链接报告IP:" + channel.localAddress().getHostString());
            System.out.println("链接报告Port:" + channel.localAddress().getPort());
            System.out.println("链接报告完毕");
            //通知客户端链接建立成功
            String str = "通知服务端链接建立成功" + " " + new Date() + " " + channel.localAddress().getHostString() + "\r\n";
            ctx.writeAndFlush(str);
        }
    
        /**
         * 当客户端主动断开服务端的链接后,这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
         */
        @Override
        public void channelInactive(ChannelHandlerContext ctx) throws Exception {
            System.out.println("断开链接" + ctx.channel().localAddress().toString());
        }
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
            //接收msg消息{与上一章节相比,此处已经不需要自己进行解码}
            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 接收到消息:" + msg);
            //通知客户端链消息发送成功
            String str = "客户端收到:" + new Date() + " " + msg + "\r\n";
            ctx.writeAndFlush(str);
        }
    
        /**
         * 抓住异常,当发生异常的时候,可以做一些相应的处理,比如打印日志、关闭链接
         */
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            ctx.close();
            System.out.println("异常信息:\r\n" + cause.getMessage());
        }
    
    }
    

    NettyClient.java

    /**
     * 虫洞栈:https://bugstack.cn
     * 公众号:bugstack虫洞栈  {获取学习源码}
     * Create by fuzhengwei on 2019
     */
    public class NettyClient {
    
        public static void main(String[] args) {
            new NettyClient().connect("127.0.0.1", 7397);
        }
    
        private void connect(String inetHost, int inetPort) {
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            try {
                Bootstrap b = new Bootstrap();
                b.group(workerGroup);
                b.channel(NioSocketChannel.class);
                b.option(ChannelOption.AUTO_READ, true);
                b.handler(new MyChannelInitializer());
                ChannelFuture f = b.connect(inetHost, inetPort).sync();
                System.out.println("itstack-demo-netty client start done. {关注公众号:bugstack虫洞栈,获取源码}");
                f.channel().closeFuture().sync();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                workerGroup.shutdownGracefully();
            }
        }
    
    }
    

    测试结果

    启动模拟器NetAssist 设置TCP Server

    微信公众号:bugstack虫洞栈

    启动客户端NettyClient

    微信公众号:bugstack虫洞栈

    执行结果

    /**
     * 虫洞栈:https://bugstack.cn
     * 公众号:bugstack虫洞栈  {获取学习源码}
     * Create by fuzhengwei on 2019
     */
    public class NettyClient {
    
        public static void main(String[] args) {
            new NettyClient().connect("127.0.0.1", 7397);
        }
    
        private void connect(String inetHost, int inetPort) {
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            try {
                Bootstrap b = new Bootstrap();
                b.group(workerGroup);
                b.channel(NioSocketChannel.class);
                b.option(ChannelOption.AUTO_READ, true);
                b.handler(new MyChannelInitializer());
                ChannelFuture f = b.connect(inetHost, inetPort).sync();
                System.out.println("itstack-demo-netty client start done. {关注公众号:bugstack虫洞栈,获取源码}");
                f.channel().closeFuture().sync();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                workerGroup.shutdownGracefully();
            }
        }
    
    }
    

    微信公众号:bugstack虫洞栈,欢迎您的关注&获取源码!

    相关文章

      网友评论

        本文标题:netty案例,netty4.1基础入门篇八《NettyClie

        本文链接:https://www.haomeiwen.com/subject/kjflsctx.html