基于http的netty demo
1.引入netty的pom
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty-all</artifactId>
- <version>4.1.10.Final</version>
- </dependency>
2.编写代码
- 1 package com.bill.httpdemo;
- 2
- 3
- 4 import io.netty.bootstrap.ServerBootstrap;
- 5 import io.netty.channel.ChannelFuture;
- 6 import io.netty.channel.EventLoopGroup;
- 7 import io.netty.channel.nio.NioEventLoopGroup;
- 8 import io.netty.channel.socket.nio.NioServerSocketChannel;
- 9
- 10 public class HttpServer {
- 11
- 12 public static void main(String[] args) throws Exception {
- 13
- 14 // 这2个group都是死循环,阻塞式
- 15 EventLoopGroup bossGroup = new NioEventLoopGroup();
- 16 EventLoopGroup workerGroup = new NioEventLoopGroup();
- 17
- 18 try {
- 19 ServerBootstrap serverBootstrap = new ServerBootstrap();
- 20 serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).
- 21 childHandler(new HttpServerInitializer());
- 22
- 23 ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
- 24 channelFuture.channel().closeFuture().sync();
- 25 } finally {
- 26 bossGroup.shutdownGracefully();
- 27 workerGroup.shutdownGracefully();
- 28 }
- 29 }
- 30
- 31 }
- 32
- 33 package com.bill.httpdemo;
- 34
- 35 import io.netty.buffer.ByteBuf;
- 36 import io.netty.buffer.Unpooled;
- 37 import io.netty.channel.ChannelHandlerContext;
- 38 import io.netty.channel.SimpleChannelInboundHandler;
- 39 import io.netty.handler.codec.http.*;
- 40 import io.netty.util.CharsetUtil;
- 41
- 42 import java.net.URI;
- 43
- 44 public class HttpServerHandler extends SimpleChannelInboundHandler<HttpObject> {
- 45
- 46 /**
- 47 * 读取客户端请求,并且返回给客户端数据的方法
- 48 */
- 49 @Override
- 50 protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws Exception {
- 51
- 52 if(!(httpObject instanceof HttpRequest)) {
- 53 return;
- 54 }
- 55
- 56 System.out.println("excute channelRead0");
- 57
- 58 HttpRequest httpRequest = (HttpRequest) httpObject;
- 59
- 60 URI uri = new URI(httpRequest.uri());
- 61 System.out.println(uri.getPath());
- 62
- 63 ByteBuf content = Unpooled.copiedBuffer("Hello World", CharsetUtil.UTF_8);
- 64 FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,
- 65 HttpResponseStatus.OK, content);
- 66 response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");
- 67 response.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes());
- 68
- 69 channelHandlerContext.writeAndFlush(response);
- 70 }
- 71 }
- 72
- 73 package com.bill.httpdemo;
- 74
- 75 import io.netty.channel.ChannelInitializer;
- 76 import io.netty.channel.ChannelPipeline;
- 77 import io.netty.channel.socket.SocketChannel;
- 78 import io.netty.handler.codec.http.HttpServerCodec;
- 79
- 80 public class HttpServerInitializer extends ChannelInitializer<SocketChannel> {
- 81
- 82 @Override
- 83 protected void initChannel(SocketChannel socketChannel) throws Exception {
- 84
- 85 ChannelPipeline pipeline = socketChannel.pipeline();
- 86
- 87 pipeline.addLast("HttpServerCodec", new HttpServerCodec());
- 88 pipeline.addLast("HttpServerHandler", new HttpServerHandler());
- 89 }
- 90 }
3.启动服务器,执行HttpServer的main方法
4.浏览器输入网址:
http://127.0.0.1:8899/hello/world
客户端输出:
服务器输出:
完整代码下载:
https://download.csdn.net/download/mweibiao/10551574
基于http的netty demo的更多相关文章
- 基于websocket的netty demo
前面2文 基于http的netty demo 基于socket的netty demo 讲了netty在http和socket的使用,下面讲讲netty如何使用websocket websocket是h ...
- 基于socket的netty demo
前面一文说了 基于http的netty demo 和http不一样,http可以用浏览器来充当客户端调用,所以基于socket的netty,必须要编写客户端和服务器的代码 实现功能: 客户端给服务器发 ...
- 一个基于vue的仪表盘demo
最近写了一个基于vue的仪表盘,其中 主要是和 transform 相关的 css 用的比较多.给大家分享一下,喜欢的话点个赞呗?嘿嘿 截图如下: 实际效果查看地址:https://jhcan333. ...
- 基于websocket vue 聊天demo 解决方案
基于websocket vue 聊天demo 解决方案 demo 背景 电商后台管理的客服 相关技术 vuex axios vue websocket 聊天几种模型 一对一模型 一对一 消息只一个客户 ...
- 基于Lucene的文件检索Demo
通过Lucene实现了简单的文件检索功能的Demo.这个Demo支持基于文件内容的检索,支持中文分词和高亮显示. 下面简单的介绍下核心的类 1)索引相关的类 1.FileIndexBuilder -- ...
- Java NIO框架Netty demo
Netty是什么 Netty是一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty 是一个基于NI ...
- netty demo
Netty 4.0 demo netty是一个异步,事件驱动的网络编程框架&工具,使用netty,可以快速开发从可维护,高性能的协议服务和客户端应用.是一个继mina之后,一个非常受欢迎的 ...
- 基于NIO的Netty网络框架
Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者 ...
- .Net语言 APP开发平台——Smobiler学习日志:基于Access数据库的Demo
说明:该demo是基于Access数据库进行客户信息的新增.查看.编辑 新增客户信息和客户列表 Demo下载:https://github.com/comsmobiler/demo-videos 中 ...
随机推荐
- PyQt(Python+Qt)学习随笔:QDateTimeEdit日期时间编辑部件
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 Designer输入部件中,Date/Time E ...
- 第15.31节 PyQt(Python+Qt)入门学习:containers容器类部件GroupBox分组框简介
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...
- PyQt(Python+Qt)学习随笔:QTreeView树形视图的autoExpandDelay属性
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeView树形视图的autoExpandDelay属性用于控制在视图中拖拽时,当鼠标停留在一 ...
- PyQt学习随笔:ListView控件增加列表项
ListView控件如果需要增加列表项,就是在对应数据存储中插入项,这又分两种情况,一种是已知列表数据存储,一种是未知数据存储.如果是未知数据存储,可以通过: ListView控件名.model() ...
- 数据结构——创建链表或树节点的小trick(哑结点)
一般创建链表时,我们可以创建一个哑结点,来保存头部 * struct ListNode { * int val; * ListNode *next; * ListNod ...
- Mac下查看端口占用情况
为什么 后端开发时,有时会碰到服务无法正常启动,端口被占用.这时需要查看端口占用情况. 是什么 需要用到一些Linux命令. 怎么做 查看占用端口51805的进程 lsof -n -P -i TCP ...
- vue functional函数式组件
第1种写法 test.vue <template functional> <div class="test"> {{props.test.name}} &l ...
- C# 9.0新特性详解系列之五:记录(record)和with表达式
1 背景与动机 传统面向对象编程的核心思想是一个对象有着唯一标识,表现为对象引用,封装着随时可变的属性状态,如果你改变了一个属性的状态,这个对象还是原来那个对象,就是对象引用没有因为状态的改变而改变, ...
- Java并发编程的艺术(十二)——并发容器和框架
ConcurrentHashMap 为什么需要ConcurrentHashMap HashMap线程不安全,因为HashMap的Entry是以链表的形式存储的,如果多线程操作可能会形成环,那样就会死循 ...
- Mysql为什么使用b+树,而不是b树、AVL树或红黑树?
首先,我们应该考虑一个问题,数据库在磁盘中是怎样存储的?(答案写在下一篇文章中) b树.b+树.AVL树.红黑树的区别很大.虽然都可以提高搜索性能,但是作用方式不同. 通常文件和数据库都存储在磁盘,如 ...