1.引入netty的pom

  1. <dependency>
  2. <groupId>io.netty</groupId>
  3. <artifactId>netty-all</artifactId>
  4. <version>4.1.10.Final</version>
  5. </dependency>

2.编写代码

  1. 1 package com.bill.httpdemo;
  2. 2
  3. 3
  4. 4 import io.netty.bootstrap.ServerBootstrap;
  5. 5 import io.netty.channel.ChannelFuture;
  6. 6 import io.netty.channel.EventLoopGroup;
  7. 7 import io.netty.channel.nio.NioEventLoopGroup;
  8. 8 import io.netty.channel.socket.nio.NioServerSocketChannel;
  9. 9
  10. 10 public class HttpServer {
  11. 11
  12. 12 public static void main(String[] args) throws Exception {
  13. 13
  14. 14 // 这2个group都是死循环,阻塞式
  15. 15 EventLoopGroup bossGroup = new NioEventLoopGroup();
  16. 16 EventLoopGroup workerGroup = new NioEventLoopGroup();
  17. 17
  18. 18 try {
  19. 19 ServerBootstrap serverBootstrap = new ServerBootstrap();
  20. 20 serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).
  21. 21 childHandler(new HttpServerInitializer());
  22. 22
  23. 23 ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
  24. 24 channelFuture.channel().closeFuture().sync();
  25. 25 } finally {
  26. 26 bossGroup.shutdownGracefully();
  27. 27 workerGroup.shutdownGracefully();
  28. 28 }
  29. 29 }
  30. 30
  31. 31 }
  32. 32
  33. 33 package com.bill.httpdemo;
  34. 34
  35. 35 import io.netty.buffer.ByteBuf;
  36. 36 import io.netty.buffer.Unpooled;
  37. 37 import io.netty.channel.ChannelHandlerContext;
  38. 38 import io.netty.channel.SimpleChannelInboundHandler;
  39. 39 import io.netty.handler.codec.http.*;
  40. 40 import io.netty.util.CharsetUtil;
  41. 41
  42. 42 import java.net.URI;
  43. 43
  44. 44 public class HttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {
  45. 45
  46. 46 /**
  47. 47 * 读取客户端请求,并且返回给客户端数据的方法
  48. 48 */
  49. 49 @Override
  50. 50 protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws Exception {
  51. 51
  52. 52 if(!(httpObject instanceof HttpRequest)) {
  53. 53 return;
  54. 54 }
  55. 55
  56. 56 System.out.println("excute channelRead0");
  57. 57
  58. 58 HttpRequest httpRequest = (HttpRequest) httpObject;
  59. 59
  60. 60 URI uri = new URI(httpRequest.uri());
  61. 61 System.out.println(uri.getPath());
  62. 62
  63. 63 ByteBuf content = Unpooled.copiedBuffer("Hello World", CharsetUtil.UTF_8);
  64. 64 FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,
  65. 65 HttpResponseStatus.OK, content);
  66. 66 response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");
  67. 67 response.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());
  68. 68
  69. 69 channelHandlerContext.writeAndFlush(response);
  70. 70 }
  71. 71 }
  72. 72
  73. 73 package com.bill.httpdemo;
  74. 74
  75. 75 import io.netty.channel.ChannelInitializer;
  76. 76 import io.netty.channel.ChannelPipeline;
  77. 77 import io.netty.channel.socket.SocketChannel;
  78. 78 import io.netty.handler.codec.http.HttpServerCodec;
  79. 79
  80. 80 public class HttpServerInitializer extends ChannelInitializer<SocketChannel> {
  81. 81
  82. 82 @Override
  83. 83 protected void initChannel(SocketChannel socketChannel) throws Exception {
  84. 84
  85. 85 ChannelPipeline pipeline = socketChannel.pipeline();
  86. 86
  87. 87 pipeline.addLast("HttpServerCodec", new HttpServerCodec());
  88. 88 pipeline.addLast("HttpServerHandler", new HttpServerHandler());
  89. 89 }
  90. 90 }

3.启动服务器,执行HttpServer的main方法

4.浏览器输入网址:

http://127.0.0.1:8899/hello/world

客户端输出:

服务器输出:

完整代码下载:

https://download.csdn.net/download/mweibiao/10551574

基于http的netty demo的更多相关文章

  1. 基于websocket的netty demo

    前面2文 基于http的netty demo 基于socket的netty demo 讲了netty在http和socket的使用,下面讲讲netty如何使用websocket websocket是h ...

  2. 基于socket的netty demo

    前面一文说了 基于http的netty demo 和http不一样,http可以用浏览器来充当客户端调用,所以基于socket的netty,必须要编写客户端和服务器的代码 实现功能: 客户端给服务器发 ...

  3. 一个基于vue的仪表盘demo

    最近写了一个基于vue的仪表盘,其中 主要是和 transform 相关的 css 用的比较多.给大家分享一下,喜欢的话点个赞呗?嘿嘿 截图如下: 实际效果查看地址:https://jhcan333. ...

  4. 基于websocket vue 聊天demo 解决方案

    基于websocket vue 聊天demo 解决方案 demo 背景 电商后台管理的客服 相关技术 vuex axios vue websocket 聊天几种模型 一对一模型 一对一 消息只一个客户 ...

  5. 基于Lucene的文件检索Demo

    通过Lucene实现了简单的文件检索功能的Demo.这个Demo支持基于文件内容的检索,支持中文分词和高亮显示. 下面简单的介绍下核心的类 1)索引相关的类 1.FileIndexBuilder -- ...

  6. Java NIO框架Netty demo

    Netty是什么 Netty是一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty 是一个基于NI ...

  7. netty demo

    Netty 4.0 demo   netty是一个异步,事件驱动的网络编程框架&工具,使用netty,可以快速开发从可维护,高性能的协议服务和客户端应用.是一个继mina之后,一个非常受欢迎的 ...

  8. 基于NIO的Netty网络框架

    Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者 ...

  9. .Net语言 APP开发平台——Smobiler学习日志:基于Access数据库的Demo

    说明:该demo是基于Access数据库进行客户信息的新增.查看.编辑 新增客户信息和客户列表 Demo下载:https://github.com/comsmobiler/demo-videos  中 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QDateTimeEdit日期时间编辑部件

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 Designer输入部件中,Date/Time E ...

  2. 第15.31节 PyQt(Python+Qt)入门学习:containers容器类部件GroupBox分组框简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  3. PyQt(Python+Qt)学习随笔:QTreeView树形视图的autoExpandDelay属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeView树形视图的autoExpandDelay属性用于控制在视图中拖拽时,当鼠标停留在一 ...

  4. PyQt学习随笔:ListView控件增加列表项

    ListView控件如果需要增加列表项,就是在对应数据存储中插入项,这又分两种情况,一种是已知列表数据存储,一种是未知数据存储.如果是未知数据存储,可以通过: ListView控件名.model() ...

  5. 数据结构——创建链表或树节点的小trick(哑结点)

    一般创建链表时,我们可以创建一个哑结点,来保存头部  * struct ListNode {  *     int val;  *     ListNode *next;  *     ListNod ...

  6. Mac下查看端口占用情况

    为什么 后端开发时,有时会碰到服务无法正常启动,端口被占用.这时需要查看端口占用情况. 是什么 需要用到一些Linux命令. 怎么做 查看占用端口51805的进程 lsof -n -P -i TCP ...

  7. vue functional函数式组件

    第1种写法 test.vue <template functional> <div class="test"> {{props.test.name}} &l ...

  8. C# 9.0新特性详解系列之五:记录(record)和with表达式

    1 背景与动机 传统面向对象编程的核心思想是一个对象有着唯一标识,表现为对象引用,封装着随时可变的属性状态,如果你改变了一个属性的状态,这个对象还是原来那个对象,就是对象引用没有因为状态的改变而改变, ...

  9. Java并发编程的艺术(十二)——并发容器和框架

    ConcurrentHashMap 为什么需要ConcurrentHashMap HashMap线程不安全,因为HashMap的Entry是以链表的形式存储的,如果多线程操作可能会形成环,那样就会死循 ...

  10. Mysql为什么使用b+树,而不是b树、AVL树或红黑树?

    首先,我们应该考虑一个问题,数据库在磁盘中是怎样存储的?(答案写在下一篇文章中) b树.b+树.AVL树.红黑树的区别很大.虽然都可以提高搜索性能,但是作用方式不同. 通常文件和数据库都存储在磁盘,如 ...