Netty实现丢弃服务协议(Netty4.X学习一)

举报
INGUCoder 发表于 2019/04/24 22:44:39 2019/04/24
【摘要】 何为丢弃服务(Discard Protocol),丢弃服务就是一个协议,是最简单的协议,它的作用是接受到什么就丢弃什么,它对调试网路状态有一定的用处。基于TCP的丢弃服务,服务器实现了丢弃丢弃协议,服务器就会在TCP端口9检测丢弃协议请求,在建立连接后并检测到请求后,就直接把接受到数据丢弃,而不响应用户,直到用户断开连接。NIO核心: 缓冲区:buffer 包含要写入或者是要读出的数据...

何为丢弃服务(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();
} 
    
    }




}

运行结果:

微信截图_20190424223841.png


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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。