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服务器相关推荐

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

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

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

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

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

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

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

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

  5. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )

    文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...

  6. 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】

    一.Netty是什么? Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发 本质:网络应用程序框架 实现:异步.事件驱动 特性:高性能.可维护.快速开发 用途:开发服务器和 ...

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

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

  8. 【Netty】Netty 核心组件 ( ChannelPipeline 中的 ChannelHandlerContext 双向链表分析 )

    文章目录 一. 代码示例分析 二. ChannelHandlerContext 双向链表类型 三. Pipeline / ChannelPipeline 管道内双向链表分析 四. 数据入站与出站 接上 ...

  9. 【Netty】Netty 入门案例分析 ( Netty 模型解析 | Netty 服务器端代码 | Netty 客户端代码 )

    文章目录 一. Netty 模型代码解析 二. Netty 案例服务器端代码 1 . 服务器主程序 2 . 服务器自定义 Handler 处理者 三. Netty 案例客户端代码 1 . 客户端主程序 ...

  10. 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )

    文章目录 I . Netty 简介 II . Netty 应用场景 III . Java I/O 模型 IV . BIO 概念 V . BIO 开发流程 VI . BIO 实例 VII . BIO 模 ...

最新文章

  1. react如何在父组件中调用子组件事件
  2. flex白板之图形绘制函数
  3. React 16 Jest手动模拟(Manual Mocks)
  4. MySQL之在储存过程中使用表名为变量
  5. [DevExpress]设置RepositoryItemComboBox只可下拉选择不可编辑
  6. 把别人的Tcl/Tk代码加入到Go语言里2 矩形
  7. node 的多进程架构
  8. 计算机专业岗位细分及学习必备清单
  9. bos物流项目面试问题汇总
  10. 已知三边求三角形夹角度数
  11. 阿里爸爸YYDS!阿里内网首发的Java成长开发手册,不惜重金开源
  12. 高效的word转换成pdf转换器
  13. 数字电视 星座图 matlab,数字电视 MER 及星座图剖析
  14. 十个技巧,让你成为“降维”专家
  15. TM1638 LED数码显示模块ARDUINO驱动代码
  16. 计算机控制直流电机闭环调速实验报告,PID控制电机实验报告
  17. linux 日志中搜索,linux中的搜索总结,通常用户搜索log文件
  18. Naive script setup写法上传注意
  19. 2022年7月上市公司新闻事件分析总结报告
  20. 【UnityNGUI】PS裁剪UI把部分图片留着透明的部分新建图集调整NGUI的Sprite大小

热门文章

  1. c++ 制作低配扫雷游戏
  2. CoreDNS介绍与使用
  3. zscore 是如何标准化矩阵的?
  4. Cesium中点至直线的垂足点和距离计算
  5. ***大数据项目会议记录
  6. 基于 dpdk-nginx 的 c1000k 并发研发
  7. 【CAD二次开发】-ObjectARX-JIG 一拖多 (MultipleEntJig)
  8. MATLAB算法实战应用案例精讲-【人工智能】SLAM(概念篇)(补充篇)
  9. 一篇文章让你完全理解置信区间与置信度
  10. JAVA程序设计课程期末设计