• netty02(接受消息以后进行返回)


         到这里接着上一篇netty01开始,没看过的可以点进去看一下再来

         首先来说一下 ByteBuf   这个类吧,这个类是netty里面提供的,接受信息和返回信息格式都是它;

        ByteBuf   是一个抽象类,不过netty提供了创建方法

         String rmsg="66666";
               ByteBuf in2= Unpooled.copiedBuffer(rmsg.getBytes());

         上一篇已经写到可以接受信息了,这里就直接开始写如何返回信息了,为了方便测试和学习,还是去百度下载一个tcp助手吧。后面我就不写关于命令行的测试了;

         直接上代码了,都是基础。比较简单的内容;

          

    package com.netty.nettys01;
    
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    import io.netty.channel.ChannelHandlerAdapter;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.util.CharsetUtil;
    import io.netty.util.ReferenceCountUtil;
    
    public class DiscardServerHandler extends ChannelHandlerAdapter {
        /**
         * 这里我们覆盖了chanelRead()事件处理方法。 每当从客户端收到新的数据时, 这个方法会在收到消息时被调用,
         * 这个例子中,收到的消息的类型是ByteBuf
         *
         * @param ctx
         *            通道处理的上下文信息
         * @param msg
         *            接收的消息
         */
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
    
            try {
                ByteBuf in = (ByteBuf) msg;
                // 打印客户端输入,传输过来的的字符
               String msg2 = in.toString(CharsetUtil.UTF_8);
                System.out.print(msg2);
                String rmsg="66666";//返回的信息
               ByteBuf in2= Unpooled.copiedBuffer(rmsg.getBytes());//进行处理
                ctx.writeAndFlush(in2);//返回信息
    
            } finally {
                /**
                 * ByteBuf是一个引用计数对象,这个对象必须显示地调用release()方法来释放。
                 * 请记住处理器的职责是释放所有传递到处理器的引用计数对象。
                 */
                // 抛弃收到的数据
                ReferenceCountUtil.release(msg);
    
            }
    
        }
    
        /***
         * 这个方法会在发生异常时触发
         *
         * @param ctx
         * @param cause
         */
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            /**
             * exceptionCaught() 事件处理方法是当出现 Throwable 对象才会被调用,即当 Netty 由于 IO
             * 错误或者处理器在处理事件时抛出的异常时。在大部分情况下,捕获的异常应该被记录下来 并且把关联的 channel
             * 给关闭掉。然而这个方法的处理方式会在遇到不同异常的情况下有不 同的实现,比如你可能想在关闭连接之前发送一个错误码的响应消息。
             */
            // 出现异常就关闭
            System.out.println("发生异常了----------------------------");
            cause.printStackTrace();
            ctx.close();
        }
    
    
    }

       从上面的代码可以看出 ChannelHandlerContext ctx   这个类就是用来返回信息的,不管是接受到信息以后,还是发生异常以后,都存在这个对象;

      后面测试的就不写了,和上一篇一样的,发送信息了以后就会收到返回的信息了。测试方法也在这一篇netty01里面,可以点进去看看就知道了。

  • 相关阅读:
    Linux新手随手笔记2.4-使用DHCP动态管理主机地址
    在word中输入任意角度旋转图片
    VBA注释临时
    VBA改写VBA代码
    【转载】robocopy的用法
    Excel数组排序+图片统一大小
    一键调节音量
    合并文档时让第一页为奇数
    智能跳转---TC资源管理器
    win7一键拖动生成快速启动栏
  • 原文地址:https://www.cnblogs.com/qq376324789/p/9924617.html
Copyright © 2020-2023  润新知