基于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 中 ...
随机推荐
- python初次接触
1.python有什么用或者能做什么? 可以做网站(比如 YouTube.豆瓣),可以做图片处理,可以做科学计算,也可以爬虫,甚至于游戏,学好Python后不用担心没有用武之地,Google就大量的在 ...
- 第11.4节 Python正则表达式搜索字符集匹配功能及元字符”[]”介绍
Python正则表达式字符集匹配表示是指搜索一个字符,该字符在给定的一个字符的集合中.元字符'['和']'是用于组合起来定义匹配字符集,匹配模式中使用 '['开头,并使用']'结尾来穷举搜索的字符可能 ...
- Python妙用re.sub分析正则表达式匹配过程
声明:本文所使用方法为老猿自行研究并编码,相关代码版权为老猿所有,禁止转载文章,代码禁止用于商业用途! 在<第11.23节 Python 中re模块的搜索替换功能:sub及subn函数>介 ...
- PyCharm中怎么将非当前工程文件的目录的文件加到当前工程中
在PyCharm已经建立工程文件的情况下,如果要将一个其他目录的文件导入到已有的工程中,唯一的方法如下: 通过File->Settings->Project->Project Str ...
- RedHat操作指令第2篇
六.RPM包管理命令 主要功能 查询RPM软件.包文件的相关信息 安装.升级.卸载RPM软件包 维护RPM数据库信息 查询RPM软件信息 查询已安装的RPM软件信息 格式:rpm -q[子选项] [软 ...
- 几句话说明 .NET MVC中ViewData, ViewBag和TempData的区别
ViewData和TempData是字典类型,赋值方式用字典方式, ViewData["myName"] ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.my ...
- 用STM32定时器测量信号频率——测频法和测周法[原创cnblogs.com/helesheng]
工业测试与控制系统中,经常需要对未知信号的频率进行测试.对于10MHz以下的信号,用单片机(MCU)定时器完成这项任务显然是最常见和最佳的选择.目前性价比最高的单片机STM32拥有功能强大且数量众多的 ...
- 原创:DynamicDataDisplay波形显示自定义格式
原创:DynamicDataDisplay 原版本在日期显示的格式上与我们的习惯不一样,特做如下修改: 自定义日期格式修改: //MainWindow.cs中 var ds = new Enumera ...
- TimSort源码详解
Python的排序算法由Peter Tim提出,因此称为TimSort.它最先被使用于Python语言,后被多种语言作为默认的排序算法.TimSort实际上可以看作是mergeSort+binaryS ...
- mysql 8.0 改变数据目录和日志目录(一)
一.背景 原数据库数据目录:/data/mysql3306/data,日志文件目录:/data/mysql3306/binlog 变更后数据库目录:/mysqldata/3306/data,日志文件目 ...