浅谈netty作为http服务器的轮廓
时间:2019-10-08
本文章向大家介绍浅谈netty作为http服务器的轮廓,主要包括浅谈netty作为http服务器的轮廓使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
public class TestServer { public static void main(String[] args) throws Exception{ //创建两个线程组,一个bossGroup,一个workerGroup EventLoopGroup bossGroup = new NioEventLoopGroup(); //事件循环组,异步io EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); //Bootstrap和ServerBootstrap是netty服务端启动的配置类 serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) //用到NioServerSocketChannel管道 .childHandler(new TestServerInitializer()); //子处理器,(这里用到的是自己定义的初始化器) ChannelFuture channelFuture = serverBootstrap.bind(8888).sync(); channelFuture.channel().closeFuture().sync(); //关闭 } finally{ bossGroup.shutdownGracefully(); //优雅关闭 workerGroup.shutdownGracefully(); } } }
首先定义两个基于NIO的事件循环组(EventLoopGroup),一个用于接收连接(bossGroup),另一个用于完成对应的连接处理(workerGroup)。
ServerBootstrap是netty提供的帮助我们简化服务器启动的类,而我们需要再定义一个子处理器,其作用是在channel一旦被注册到处理器上之
后就会运行代码。这时候绑定端口号并且同步,http服务器的轮廓就建好了。
public class TestHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> { @Override protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception { //读取客户端发来的请求并向客户端返回响应的方法 System.out.println(msg.getClass()); System.out.println(ctx.channel().remoteAddress()); Thread.sleep(8000); if(msg instanceof HttpRequest){ HttpRequest httpRequest = (HttpRequest)msg; //啰嗦一下,转换msg类型 System.out.println("请求方法名:" + httpRequest.method().name()); URI uri = new URI(httpRequest.uri()); if("/favicon.ico".equals(uri.getPath())) { System.out.println("请求favicon.con"); return; } ByteBuf content = Unpooled.copiedBuffer("Hello world !", CharsetUtil.UTF_8); //ByteBuf对象是向客户端返回的内容 //netty提供的简化的专门支撑响应的对象 FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,content); //响应不是ServerResponses而是netty,HttpVersion1.1就是keep alive response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain"); //设置response相关的头信息,内容类型 response.headers().set(HttpHeaderNames.CONTENT_LENGTH,content.readableBytes()); //响应内容长度 ctx.writeAndFlush(response); ctx.channel().close(); } } /** * @Description: 重写SimpleChannelInboundHandler中的方法,可以进一步了解连接创建的步骤 * * @Author: KlayHu * * @Create: 2019/10/6 12:14 **/ @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { super.handlerAdded(ctx); System.out.println("handler added"); } @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { super.channelRegistered(ctx); System.out.println("channel registered"); } @Override public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { super.channelUnregistered(ctx); System.out.println("channel unregistered"); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { super.channelActive(ctx); System.out.println("channel active"); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { super.channelInactive(ctx); System.out.println("channel inactive"); }
ChannelHandlerContext是netty架构中很重要的对象,表示上下文获得相关的信息,比如远程地址,亦或是通过它获得的channel对象。而在我
们自定义的子处理器中,重写SimpleChannelInboundHandler中的方法,可以便于我们了解连接创建的各个状态,在HTTP/1.1协议的响应模式
下,通过终端命令curl或者浏览器访问本地端口均可。
原文地址:https://www.cnblogs.com/kkuuklay/p/11634682.html
- POJ 1017 Packets
- Codeforces 725B Food on the Plane
- Codefoces 723B Text Document Analysis
- Codefoces 723A The New Year: Meeting Friends
- ECJTUACM16 Winter vacation training #1 题解&源码
- 信息学奥赛一本通算法(C++版)基础算法:高精度计算
- 看破欧拉函数的奥秘
- 线段树入门总结
- 从零基础学三分查找
- Codeforces Beta Round #1 A,B,C
- 线性分类器-中篇
- isupper()函数
- HDU 5882 Balanced Game
- 超级玛丽游戏
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP7引入的"??"和"?:"的区别讲解
- Python自动化操作实现图例绘制
- ThinkPHP5.0框架使用build 自动生成模块操作示例
- PHP远程连接oracle数据库操作实现方法图文详解
- 微信公众平台开发教程②微信端分享功能图文详解
- 微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
- keras分类之二分类实例(Cat and dog)
- 详解Python 循环嵌套
- PHP中quotemeta()函数的用法讲解
- 微信公众号实现扫码获取微信用户信息(网页授权)
- 实例说明js脚本语言和php脚本语言的区别
- 在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
- PHP7匿名类的用法示例
- laravel配置Redis多个库的实现方法
- PHP中Static(静态)关键字功能与用法实例分析