【Netty】五、Netty实现Http服务器
Netty实现http服务器
- 一、Netty实现hhttp服务器
- 代码演示
- HttpServer
- HttpServerHandler
- HttpServerInitializer (http请求解码和编码)
一、Netty实现hhttp服务器
Netty除了支持 TCP 协议以外,内部还支持多种协议,比如telnet、UDP、http、http2、websocket等;
要支持这些协议,主要就是支持这些协议的报文解析,能把这些协议的报文进行编码和解码,就可以了;
比如http协议的报文格式是这样的:
那么netty内部已经支持这种http报文格式的解析,所以我们能使用netty开发http服务器;
Netty支持websocket
我们知道Netty除了支持 TCP 协议以外,内部还支持多种协议,比如telnet、UDP、http、http2、websocket等;
要支持这些协议,主要就是支持这些协议的报文解析,能把这些协议的报文进行编码和解码,就可以了;
比如websocket协议的报文格式是这样的:
Netty内置了对websocket协议的编码和解码,从而可以使用netty开发基于websocket连接的应用;
代码演示
HttpServer
import com.mytest.http.handler.HttpServerInitializer;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;public final class HttpServer {static final int PORT = Integer.parseInt(System.getProperty("port", "8080"));public static void main(String[] args) throws Exception {// Configure the server.EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)//.handler(new LoggingHandler(LogLevel.INFO)).childHandler(HttpServerInitializer.INSTANCE);Channel ch = b.bind(PORT).sync().channel();System.err.println("请在浏览器打开 http://127.0.0.1:" + PORT + '/');ch.closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}
HttpServerHandler
import io.netty.channel.*;
import io.netty.handler.codec.http.*;@ChannelHandler.Sharable
public class HttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {public static final HttpServerHandler INSTANCE = new HttpServerHandler();private static final byte[] CONTENT = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' };@Overridepublic void channelRegistered(ChannelHandlerContext ctx) throws Exception {System.out.println("channelRegistered......");}@Overridepublic void channelUnregistered(ChannelHandlerContext ctx) throws Exception {System.out.println("channelUnregistered......");}@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {System.out.println("channelActive......");}@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {System.out.println("channelInactive......");}@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {System.out.println("userEventTriggered......");}@Overridepublic void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception {System.out.println("channelWritabilityChanged......");}@Overrideprotected void ensureNotSharable() {System.out.println("ensureNotSharable......");}@Overridepublic boolean isSharable() {System.out.println("isSharable......");return super.isSharable();}@Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {System.out.println("handlerAdded......");}@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {System.out.println("handlerRemoved......");}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {//给浏览器响应DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html;charset=utf-8");//要响应的内容String src = "<!DOCTYPE html>\n" +"<html lang=\"en\">\n" +"<head>\n" +" <meta charset=\"UTF-8\">\n" +" <title>Hello Netty.</title>\n" +"</head>\n" +"<body>\n" +"Hello Netty.\n" +"</body>\n" +"</html>";response.content().writeBytes(src.getBytes("UTF-8"));ChannelFuture f = ctx.writeAndFlush(response);f.addListener(ChannelFutureListener.CLOSE);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) {System.out.println("channelReadComplete......");ctx.flush();}
HttpServerInitializer (http请求解码和编码)
http请求解码和编码
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;@ChannelHandler.Sharable
public class HttpServerInitializer extends ChannelInitializer<SocketChannel> {public static final HttpServerInitializer INSTANCE = new HttpServerInitializer();@Overridepublic void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();//对http请求的编码和解码pipeline.addLast(new HttpServerCodec());//支持http请求的编码//pipeline.addLast(new HttpResponseEncoder());//支持http请求的解码//pipeline.addLast(new HttpRequestDecoder());pipeline.addLast(HttpServerHandler.INSTANCE);}
}
【Netty】五、Netty实现Http服务器相关推荐
- client netty 主动发数据_Netty服务器无限循环给客户端发送数据
主要思路: * 服务器每隔两秒发送一次服务器的时间 * 客户端接收服务器端数据,打印出服务器的时间 服务器端代码 package netty.time.server; import io.netty. ...
- Netty -Netty心跳检测机制案例,Netty通过WebSocket编程实现服务器和客户端长链接
Netty心跳检测机制案例 案例要求 编写一个Netty心跳检测机制案例,当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,提示写空闲 服务器超过7秒没有读或者写操作时,就提示读写 ...
- Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接<2021SC@SDUSC>
2021SC@SDUSC Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接 实例要求: Http 协议是无状态的, 浏览器和服务器间的请求响应一次,下一次会重新创建连接. 要求 ...
- netty多台服务器 推送消息,基于Netty的消息推送服务器集群设计与实现
徐龙光 何顶新 摘 要:消息推送是当前移动应用中十分必要的一项技术,服务者需要使用消息推送以保持用户活跃度,提高应用存留率.为了满足消息推送的需求和增强推送系统的性能,采用Netty网络编程框架并搭建 ...
- 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )
文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...
- 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】
一.Netty是什么? Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发 本质:网络应用程序框架 实现:异步.事件驱动 特性:高性能.可维护.快速开发 用途:开发服务器和 ...
- 【Netty】Netty 核心组件 ( ChannelHandlerContext )
文章目录 一. ChannelHandlerContext 组件 二. ChannelHandlerContext 组件 debug 调试 三. ChannelHandlerContext 组件 de ...
- 【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 )
文章目录 一. 代码示例分析 二. ChannelHandlerContext 双向链表类型 三. Pipeline / ChannelPipeline 管道内双向链表分析 四. 数据入站与出站 接上 ...
- 【Netty】Netty 入门案例分析 ( Netty 模型解析 | Netty 服务器端代码 | Netty 客户端代码 )
文章目录 一. Netty 模型代码解析 二. Netty 案例服务器端代码 1 . 服务器主程序 2 . 服务器自定义 Handler 处理者 三. Netty 案例客户端代码 1 . 客户端主程序 ...
- 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )
文章目录 I . Netty 简介 II . Netty 应用场景 III . Java I/O 模型 IV . BIO 概念 V . BIO 开发流程 VI . BIO 实例 VII . BIO 模 ...
最新文章
- react如何在父组件中调用子组件事件
- flex白板之图形绘制函数
- React 16 Jest手动模拟(Manual Mocks)
- MySQL之在储存过程中使用表名为变量
- [DevExpress]设置RepositoryItemComboBox只可下拉选择不可编辑
- 把别人的Tcl/Tk代码加入到Go语言里2 矩形
- node 的多进程架构
- 计算机专业岗位细分及学习必备清单
- bos物流项目面试问题汇总
- 已知三边求三角形夹角度数
- 阿里爸爸YYDS!阿里内网首发的Java成长开发手册,不惜重金开源
- 高效的word转换成pdf转换器
- 数字电视 星座图 matlab,数字电视 MER 及星座图剖析
- 十个技巧,让你成为“降维”专家
- TM1638 LED数码显示模块ARDUINO驱动代码
- 计算机控制直流电机闭环调速实验报告,PID控制电机实验报告
- linux 日志中搜索,linux中的搜索总结,通常用户搜索log文件
- Naive script setup写法上传注意
- 2022年7月上市公司新闻事件分析总结报告
- 【UnityNGUI】PS裁剪UI把部分图片留着透明的部分新建图集调整NGUI的Sprite大小