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
Netty实现丢弃服务协议(Netty4.X学习一)的更多相关文章
- Netty4.0学习笔记系列之一:Server与Client的通讯
http://blog.csdn.net/u013252773/article/details/21046697 本文是学习Netty的第一篇文章,主要对Netty的Server和Client间的通讯 ...
- Netty(七):EventLoop学习前导——Reactor模式
了解Netty的人多少都会知道Netty的高性能的一个原因就是它是基于事件驱动的,而这一事件的原型就是Reactor模式. 所以在学习EventLoop前,很有必要先搞懂Reactor模式. 本文目录 ...
- Netty4.0学习笔记系列之二:Handler的执行顺序(转)
http://blog.csdn.net/u013252773/article/details/21195593 Handler在netty中,无疑占据着非常重要的地位.Handler与Servlet ...
- Netty4.0学习笔记系列之三:构建简单的http服务(转)
http://blog.csdn.net/u013252773/article/details/21254257 本文主要介绍如何通过Netty构建一个简单的http服务. 想要实现的目的是: 1.C ...
- Netty4.X 学习(一)
Server: import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.net ...
- Netty4.0学习笔记系列之四:混合使用coder和handler
Handler如何使用在前面的例子中已经有了示范,那么同样是扩展自ChannelHandler的Encoder和Decoder,与Handler混合后又是如何使用的?本文将通过一个实际的小例子来展示它 ...
- Netty4.0学习笔记系列之二:Handler的执行顺序
Handler在netty中,无疑占据着非常重要的地位.Handler与Servlet中的filter很像,通过Handler可以完成通讯报文的解码编码.拦截指定的报文.统一对日志错误进行处理.统一对 ...
- Netty4.0学习教程
http://blog.csdn.net/u013252773/article/details/21046697 一些属性和方法介绍 http://blog.csdn.net/zxhoo/articl ...
- (一)Netty源码学习笔记之概念解读
尊重原创,转载注明出处,原文地址:http://www.cnblogs.com/cishengchongyan/p/6121065.html 博主最近在做网络相关的项目,因此有契机学习netty,先 ...
随机推荐
- Jenkins+JMeter+Ant 接口持续集成
JMeter安装 JMeter安装包: 下载地址:https://jmeter.apache.org/download_jmeter.cgi 依赖JDK环境 JDK环境配置: JAVA_HOME ...
- [LC]783题 二叉搜索树结点最小距离(中序遍历)
①题目 给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值. 示例: 输入: root = [4,2,6,1,3,null,null]输出: 1解释:注意,root是树结点对象(T ...
- hdu 1285 确定比赛名次 (topsort)
确定比赛名次Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- nyoj 96-n-1位数 (strlen, atoi, ceil)
96-n-1位数 内存限制:64MB 时间限制:3000ms 特判: No 通过数:30 提交数:47 难度:1 题目描述: 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2) ...
- SpringBoot系列教程Web篇之开启GZIP数据压缩
本篇可以归纳在性能调优篇,虽然内容非常简单,但效果可能出乎预料的好: 分享一个真实案例,我们的服务部署在海外,国内访问时访问服务时,响应有点夸张:某些返回数据比较大的接口,耗时在 600ms+上,然而 ...
- Mac安装和卸载Mysql
目录 一.安装 二.环境变量 2.1 MySQL服务的启停和状态的查看 三.启动 四.初始化设置 4.1 退出sql界面 五.配置 5.1 检测修改结果 一.安装 第一步:打开网址,https://w ...
- Android 获取 SHA1值3步完成
未经允许,禁止
- Nginx 本地建立负载均衡(Windows环境)
需求: 现在有个需求:两台服务器,建立负载均衡. A服务器:IP:localhost:负载均衡主服务器:代理本地文件夹D:\\SampleData B服务器:IP:10.10.10.10:代理本地文件 ...
- PostGIS mysql_fdw操作日志(留观)
#####Linux终端操作命令记录,留做自己后面研究,绿色部分为成功部分 错误: 服务器"mysql_server" 不存在postgres=# create user mapp ...
- AE ArcEngine10.4+vs2012安装配置
准备内容 安装环境:win10*64位专业版,ArcGIS_Desktop_1041_151727,C#语言环境,visual studio2012 安装文件:ArcGIS_Engine_1041_1 ...