zoukankan      html  css  js  c++  java
  • Netty实现丢弃服务协议(Netty4.X学习一)

    何为丢弃服务(Discard Protocol),丢弃服务就是一个协议,是最简单的协议,它的作用是接受到什么就丢弃什么,它对调试网路状态有一定的用处。基于TCP的丢弃服务,服务器实现了丢弃丢弃协议,服务器就会在TCP端口9检测丢弃协议请求,在建立连接后并检测到请求后,就直接把接受到数据丢弃,而不响应用户,直到用户断开连接。

    NIO核心:

        缓冲区:buffer 包含要写入或者是要读出的数据。

        通道:channel  通过它读取和写入数据 它就像自来水管一样  通过Channel读取和写入。

        多路复用器(选择器):Selector  提供选择已经就绪的任务的能力

    1:编写一个处理器(Handler)handler是由netty生成用来处理I/O事件的

    // ChannelInBoundHandlerAdapter   ChannelInBoundHandlerAdapter是ChannelInBoundHandler的一个简单实现  默认情况下不会做任何处离 只
    //是简单的将操作通过fire*方法传递到channelPipeline(channelPipeline是channelHandler的容器 它负责channelHandler的管理和事件拦截和
    //调度)中的下一个channelHandler中让链中的下一个ChannelHandler去处理。注意:信息经过ChannelRead方法处理之后不会自动释放(因为信息不会
    //被自动释放所以能将消息传递给下一个ChannelHandler处理)。
    
    //丢弃收到的数据
    public class DiscardServerHandler extends ChannelInBoundHandlerAdapter{
        
        @Override
        public void channelRead(ChannelHandlerContext ctx,Object msg){
            //将数据放入缓冲中
            Bytebuffer in = (Byte) msg;
            
            //将收到的数据打印出来
            try{
                while(in.isReadable()){
                
                    Systen.out.print((char) in.readByte());
                    //强制请求清空缓冲区 让I/O系统立即完成它应该完成的输入/输出动作
                    System.out.flush();
                }
            }finallly{
                //因为bytebuffer 是一个引用计数对象 这个对象必须显示的调用release()方法来实现 而处理器的职责是释放所有传递到处理器的引用
                //计数对象
            
                ((BytBuf) msg).realse();
            
            }
            
            
        }
        //异常处理
        @Override
        public void exception(ChannelHandlerContext ctx, Throwable cause){
        
            //当出现异常就关闭连接
            
            cause.printStackTrace();
            ctx.close();
        }
        
    
    }

    2:编写一个main方法来启动服务端的DiscardServerHandler

    //丢弃任何进入的数据
    
    public class DiscardServer{
    
        //端口
        private int port;
        public DiscardServer(int port) {
        this.port = port;
        }
        public void run throws Exception(){
            //NioEventLoopGroup 是用来处理I/O操作的多线程事件循环器 NioEventLoopGroup 会被使用。Netty 提供了许多不同的 EventLoopGroup
            //的实现用来处理不同的传输。第一个经常被叫做‘boss’用来接收进来的
            //连接。第二个经常被叫做‘worker’,用来处理已经被接收的连接,一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上。
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            EventLoopGroup workerGroup = new NioEventLoopGroup();
             try {
             //ServerBootstrap 是一个启动 NIO 服务的辅助启动类。
            ServerBootstrap b = new ServerBootstrap();
            //ChannelInitializer 是一个特殊的处理类,他的目的是帮助使用者配置一个新的 Channel。
            //ption() 是提供给NioServerSocketChannel 用来接收进来的连接。
            //childOption() 是提供给由父管道 ServerChannel 接收到的连接。
            
            b.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class).childHandler
            (new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch){
                    ch.pipeline().addLast(new DiscardServerHandler());
                }
            }).option(ChannelOption.SO_BACKLOG,128).childOption(ChannelOption.SO_KEEPALIVE,true);
            /**
             * 绑定端口 开始接收进来的连接
             */
            ChannelFuture f = b.bind(port).sync();
            f.channel().closeFuture().sync();
        }finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }
    public static void main(String[] args) throws Exception {
        int port;
        if(args.length>0){
            port = Integer.parseInt(args[0]);
    
        }else {
            port = 8080;
        }
        new DiscardServer(port).run();
    } 
        
        }
    
    
    
    
    }

    运行结果:

    可以看到服务端只接受进来的数据 而没有做任何答复。

    github项目地址:https://github.com/INGUCoder/learning/tree/master/Netty%E5%AD%A6%E4%B9%A0

    来源:华为云社区  作者:INGUCoder

  • 相关阅读:
    OC-为何用copy修饰block
    OC-RunLoop运行循环
    苹果审核之遇到IPV6问题被拒的解决方法
    LeetCode学习_day1:原地算法
    OC-加载h5富文本的代码,并计算高度
    OC-bug: Undefined symbols for architecture i386: "_OBJC_CLASS_$_JPUSHRegisterEntity", referenced from:
    了解iOS各个版本新特性总结
    iOS 快速打包方法
    iOS tableView侧滑删除的第三方控件
    Object_C 集成环信时,中文环境下不显示中文
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13165687.html
Copyright © 2011-2022 走看看