文章目录

  • 一、 HTTP 服务器请求过滤功能
    • 1 . HTTP 服务器资源请求过滤
    • 2 . HTTP 请求过滤方法
  • 二、 HTTP 服务器 ( 资源过滤 ) 代码实现
    • 1 . 服务器主程序
    • 2 . 服务器业务逻辑处理类
    • 3 . 执行结果

一、 HTTP 服务器请求过滤功能


1 . HTTP 服务器资源请求过滤

在上述代码案例中 , 运行后 , 服务器端收到了两次 HTTP 请求 , 这里的两次请求 , 一个是请求 http://127.0.0.1:8888/ 地址资源 , 令一个是请求网站的图标 ;

显然我们只关心请求的 http://127.0.0.1:8888/ 地址资源 , 不关心网站图标 ;

服务器端需要屏蔽第二次对图标资源的请求 ;

2 . HTTP 请求过滤方法

过滤 HTTP 请求 , 首先要获取到 HTTP 请求的资源类型 , 下面是获取流程 ;

  • 获取 HTTP 请求 : HTTP 请求就是 HttpRequest 对象 , 该请求就是 HttpObject msg 参数 , HttpRequest httpRequest = (HttpRequest) msg ;
  • 获取请求资源的 URI 地址 : 通过 HTTP 请求可以获取 URI 资源地址 , URI uri = new URI(httpRequest.uri()) ;
  • 屏蔽请求 : 判定 URI 地址路径 , 判定 URI 中的路径中是否包含 ico , uri.getPath().contains(“ico”) , 如果包含 , 那么直接返回 , 不响应本次请求 ;

上述操作都是在 void channelRead0(ChannelHandlerContext ctx, HttpObject msg) 回调方法中执行的 ;

二、 HTTP 服务器 ( 资源过滤 ) 代码实现


1 . 服务器主程序

package kim.hsl.http;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;
import kim.hsl.netty.ServerHandler;/*** HTTP 服务器* 客户端使用浏览器访问即可*/
public class HTTPServer {public static void main(String[] args) {// 1. 创建 BossGroup 线程池 和 WorkerGroup 线程池, 其中维护 NioEventLoop 线程//     NioEventLoop 线程中执行无限循环操作// BossGroup 线程池 : 负责客户端的连接// 指定线程个数 : 客户端个数很少, 不用很多线程维护, 这里指定线程池中线程个数为 1EventLoopGroup bossGroup = new NioEventLoopGroup(1);// WorkerGroup 线程池 : 负责客户端连接的数据读写EventLoopGroup workerGroup = new NioEventLoopGroup();// 2. 服务器启动对象, 需要为该对象配置各种参数ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup) // 设置 主从 线程组 , 分别对应 主 Reactor 和 从 Reactor.channel(NioServerSocketChannel.class)  // 设置 NIO 网络套接字通道类型.option(ChannelOption.SO_BACKLOG, 128)  // 设置线程队列维护的连接个数.childOption(ChannelOption.SO_KEEPALIVE, true)  // 设置连接状态行为, 保持连接状态.childHandler(  // 为 WorkerGroup 线程池对应的 NioEventLoop 设置对应的事件 处理器 Handlernew ChannelInitializer<SocketChannel>() {// 创建通道初始化对象@Overrideprotected void initChannel(SocketChannel ch) throws Exception {// 该方法在服务器与客户端连接建立成功后会回调// 获取管道ChannelPipeline pipeline = ch.pipeline();// 为管道加入 HTTP 协议的编解码器 HttpServerCodec,// codec 中的 co 是 coder 编码器的意思, dec 是 decoder 解码器的意思// 第一个字符串是编解码器的名称pipeline.addLast("HttpServerCodec" , new HttpServerCodec());// 为管道 Pipeline 设置处理器 Hanedlerpipeline.addLast("HTTPServerHandler", new HTTPServerHandler());}});System.out.println("HTTP 服务器准备完毕 ...");ChannelFuture channelFuture = null;try {// 绑定本地端口, 进行同步操作 , 并返回 ChannelFuturechannelFuture = bootstrap.bind(8888).sync();System.out.println("HTTP 服务器开始监听 8888 端口 ...");// 关闭通道 , 开始监听操作channelFuture.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {// 出现异常后, 优雅的关闭bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

2 . 服务器业务逻辑处理类

package kim.hsl.http;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.*;
import io.netty.util.CharsetUtil;import java.net.URI;/*** HTTP 服务器处理类* SimpleChannelInboundHandler 是 ChannelInboundHandlerAdapter 子类* HttpObject 指的是服务器端与客户端处理数据时的数据类型*/
public class HTTPServerHandler extends SimpleChannelInboundHandler<HttpObject> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {if(msg instanceof HttpRequest){ //判断该  HttpObject msg 参数是否是 Http 请求System.out.println(ctx.channel().remoteAddress() + " 客户端请求数据 ... ");// HTTP 请求过滤核心代码 -----------------------------------------------------------// 判定 HTTP 请求类型, 过滤 HTTP 请求// 获取 HTTP 请求HttpRequest httpRequest = (HttpRequest) msg;// 获取网络资源 URIURI uri = new URI(httpRequest.uri());System.out.println("本次 HTTP 请求资源 " + uri.getPath());// 判定 uri 中请求的资源, 如果请求的是网站图标, 那么直接屏蔽本次请求if(uri != null && uri.getPath() != null && uri.getPath().contains("ico")){System.out.println("请求图标资源 " + uri.getPath() +", 屏蔽本次请求 !");return;}// HTTP 请求过滤核心代码 -----------------------------------------------------------// 准备给客户端浏览器发送的数据ByteBuf byteBuf = Unpooled.copiedBuffer("Hello Client", CharsetUtil.UTF_8);// 设置 HTTP 版本, 和 HTTP 的状态码, 返回内容DefaultFullHttpResponse defaultFullHttpResponse =new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, byteBuf);// 设置 HTTP 请求头// 设置内容类型是文本类型defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");// 设置返回内容的长度defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_LENGTH,byteBuf.readableBytes());// 写出 HTTP 数据ctx.writeAndFlush(defaultFullHttpResponse);}}
}

3 . 执行结果

① 运行服务器 :

② 客户端访问 : 经测试 , 用 IE 浏览器请求一次 , 用 360 浏览器请求两次 , 这里用 360 浏览器测试 ;

③ 服务器端日志 : 第一次是正常请求 , 第二次请求 /favicon.ico 网站图标资源 , 因此这里将本次请求屏蔽 ;

【Netty】使用 Netty 开发 HTTP 服务器 ( HTTP 请求过滤 )相关推荐

  1. Netty实战:Springboot+Netty+protobuf开发高性能服务器 (附源码下载)

    Springboot-cli 开发脚手架系列 Netty系列:Springboot使用Netty集成protobuf开发高性能服务器 文章目录 Springboot-cli 开发脚手架系列 简介 1. ...

  2. 【Netty】使用 Netty 开发 HTTP 服务器

    文章目录 一. HTTP 服务器开发 二. HTTP 服务器代码分析 1 . Netty 开发 HTTP 服务器与 TCP 服务器对比 2 . ChannelInitializer 设置 3 . 自定 ...

  3. Netty(3)之WebSocket协议开发时间服务器

    WebSocket协议开发 1. Http协议弊端 半双工协议:同一时刻,只有一个方向上的数据传送(客户端 --> 服务端 或者 服务端 --> 客户端) 消息冗长繁琐 针对服务器推送的黑 ...

  4. Netty实战:Springboot+Netty+websocket优雅的高性能服务器 (附源码下载)

    Springboot-cli 开发脚手架系列 Netty系列:Springboot+Netty优雅的开发websocket高性能服务器 文章目录 Springboot-cli 开发脚手架系列 前言 1 ...

  5. Netty -Netty心跳检测机制案例,Netty通过WebSocket编程实现服务器和客户端长链接

    Netty心跳检测机制案例 案例要求 编写一个Netty心跳检测机制案例,当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,提示写空闲 服务器超过7秒没有读或者写操作时,就提示读写 ...

  6. Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接<2021SC@SDUSC>

    2021SC@SDUSC Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接 实例要求: Http 协议是无状态的, 浏览器和服务器间的请求响应一次,下一次会重新创建连接. 要求 ...

  7. client netty 主动发数据_Netty服务器无限循环给客户端发送数据

    主要思路: * 服务器每隔两秒发送一次服务器的时间 * 客户端接收服务器端数据,打印出服务器的时间 服务器端代码 package netty.time.server; import io.netty. ...

  8. netty多台服务器 推送消息,基于Netty的消息推送服务器集群设计与实现

    徐龙光 何顶新 摘 要:消息推送是当前移动应用中十分必要的一项技术,服务者需要使用消息推送以保持用户活跃度,提高应用存留率.为了满足消息推送的需求和增强推送系统的性能,采用Netty网络编程框架并搭建 ...

  9. 【Netty】Netty 核心组件 ( ChannelHandlerContext )

    文章目录 一. ChannelHandlerContext 组件 二. ChannelHandlerContext 组件 debug 调试 三. ChannelHandlerContext 组件 de ...

最新文章

  1. Python练习 | Python中的strip()函数使用???(求解决方法)
  2. 二维数组离散程度matlab,(十八)数据分析中的一些概念
  3. CXF学习(2) helloworld
  4. mybatis 取查询值_MyBatis-SELECT基本查询
  5. 小汤学编程之JAVA基础day09——常用类(一):比较器、内部类和包装类
  6. Storm集群安装Version1.0.1开启Kerberos
  7. (一)netty介绍
  8. Spring : spring的aware
  9. c语言程序不能运行,C语言编程,我写了一个程序,但不能运行.
  10. JS实现文字向上无缝滚动轮播
  11. 深入学习Java中的字符串,代码点和代码单元
  12. 【数论】扩展欧几里得算法(EXTENDED-EUCLID)
  13. JQuery UI的拖拽功能
  14. CRM客户关系管理:赢得和留住客户的指南
  15. postman打不开
  16. DDS之DCPS Subscription模块
  17. Cocos2d如何实现MVC
  18. 16家上市车企2018年度中期经营业绩
  19. 《星际争霸II》AI机器人挑战顶级职业选手,你Pick谁?
  20. 咖啡就是咖啡,不管放了多少糖,依然会有淡淡的苦

热门文章

  1. [国家集训队]墨墨的等式
  2. python-函数进阶
  3. Android 阻隔返回键
  4. WebStorm V2017.1版用于Angular2开发的环境设置
  5. css 字体样式设置
  6. is not allowed to connect to this MySQL server解决办法
  7. Winform、WPF、Silverlight、MFC区别与联系
  8. 事务中SET XACT_ABORT各种用法
  9. [翻译] JTCalendar
  10. 数据库 ACCESS与SQL SERVER 2000分页SQL语句 分析