(中级篇 NettyNIO编解码开发)第十章-Http协议开发应用(基于Netty的HttpServer和HttpClient的简单实现)

1.HttpServer

 1 package nettyHttpTest;
 2
 3
 4
 5 import io.netty.bootstrap.ServerBootstrap;
 6 import io.netty.channel.ChannelFuture;
 7 import io.netty.channel.ChannelInitializer;
 8 import io.netty.channel.ChannelOption;
 9 import io.netty.channel.EventLoopGroup;
10 import io.netty.channel.nio.NioEventLoopGroup;
11 import io.netty.channel.socket.SocketChannel;
12 import io.netty.channel.socket.nio.NioServerSocketChannel;
13 import io.netty.handler.codec.http.HttpRequestDecoder;
14 import io.netty.handler.codec.http.HttpResponseEncoder;
15
16 public class HttpServer {
17
18
19
20     public void start(int port) throws Exception {
21         EventLoopGroup bossGroup = new NioEventLoopGroup();
22         EventLoopGroup workerGroup = new NioEventLoopGroup();
23         try {
24             ServerBootstrap b = new ServerBootstrap();
25             b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
26                     .childHandler(new ChannelInitializer<SocketChannel>() {
27                                 @Override
28                                 public void initChannel(SocketChannel ch) throws Exception {
29                                     // server端发送的是httpResponse,所以要使用HttpResponseEncoder进行编码
30                                     ch.pipeline().addLast(new HttpResponseEncoder());
31                                     // server端接收到的是httpRequest,所以要使用HttpRequestDecoder进行解码
32                                     ch.pipeline().addLast(new HttpRequestDecoder());
33                                     ch.pipeline().addLast(new HttpServerInboundHandler());
34                                 }
35                             }).option(ChannelOption.SO_BACKLOG, 128)
36                     .childOption(ChannelOption.SO_KEEPALIVE, true);
37
38             ChannelFuture f = b.bind(port).sync();
39
40             f.channel().closeFuture().sync();
41         } finally {
42             workerGroup.shutdownGracefully();
43             bossGroup.shutdownGracefully();
44         }
45     }
46
47     public static void main(String[] args) throws Exception {
48         HttpServer server = new HttpServer();
49         System.out.println("Http Server listening on 8844 ...");
50         server.start(8844);
51     }
52 }

2.HttpServerInboundHandler

 1 package nettyHttpTest;
 2
 3
 4
 5 import static io.netty.handler.codec.http.HttpHeaders.Names.CONNECTION;
 6 import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH;
 7 import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE;
 8 import static io.netty.handler.codec.http.HttpResponseStatus.OK;
 9 import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
10
11 import io.netty.buffer.ByteBuf;
12 import io.netty.buffer.Unpooled;
13 import io.netty.channel.ChannelHandlerAdapter;
14 import io.netty.channel.ChannelHandlerContext;
15 import io.netty.handler.codec.http.DefaultFullHttpResponse;
16 import io.netty.handler.codec.http.FullHttpResponse;
17 import io.netty.handler.codec.http.HttpContent;
18 import io.netty.handler.codec.http.HttpHeaders;
19 import io.netty.handler.codec.http.HttpHeaders.Values;
20 import io.netty.handler.codec.http.HttpRequest;
21
22 public class HttpServerInboundHandler extends ChannelHandlerAdapter {
23
24
25
26     private HttpRequest request;
27
28     @Override
29     public void channelRead(ChannelHandlerContext ctx, Object msg)
30             throws Exception {
31         if (msg instanceof HttpRequest) {
32             request = (HttpRequest) msg;
33
34             String uri = request.getUri();
35             System.out.println("Uri:" + uri);
36         }
37         if (msg instanceof HttpContent) {
38             HttpContent content = (HttpContent) msg;
39             ByteBuf buf = content.content();
40             System.out.println(buf.toString(io.netty.util.CharsetUtil.UTF_8));
41             buf.release();
42
43             String res = "I am OK";
44             FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1,
45                     OK, Unpooled.wrappedBuffer(res.getBytes("UTF-8")));
46             response.headers().set(CONTENT_TYPE, "text/plain");
47             response.headers().set(CONTENT_LENGTH,
48                     response.content().readableBytes());
49             if (HttpHeaders.isKeepAlive(request)) {
50                 response.headers().set(CONNECTION, Values.KEEP_ALIVE);
51             }
52             ctx.write(response);
53             ctx.flush();
54         }
55     }
56
57     @Override
58     public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
59         ctx.flush();
60     }
61
62     @Override
63     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
64         System.out.println(cause.getMessage());
65         ctx.close();
66     }
67
68 }

3.HttpClient

 1 package nettyHttpTest;
 2
 3 import io.netty.bootstrap.Bootstrap;
 4 import io.netty.buffer.Unpooled;
 5 import io.netty.channel.ChannelFuture;
 6 import io.netty.channel.ChannelInitializer;
 7 import io.netty.channel.ChannelOption;
 8 import io.netty.channel.EventLoopGroup;
 9 import io.netty.channel.nio.NioEventLoopGroup;
10 import io.netty.channel.socket.SocketChannel;
11 import io.netty.channel.socket.nio.NioSocketChannel;
12 import io.netty.handler.codec.http.DefaultFullHttpRequest;
13 import io.netty.handler.codec.http.HttpHeaders;
14 import io.netty.handler.codec.http.HttpMethod;
15 import io.netty.handler.codec.http.HttpRequestEncoder;
16 import io.netty.handler.codec.http.HttpResponseDecoder;
17 import io.netty.handler.codec.http.HttpVersion;
18
19 import java.net.URI;
20
21 public class HttpClient {
22     public void connect(String host, int port) throws Exception {
23         EventLoopGroup workerGroup = new NioEventLoopGroup();
24
25         try {
26             Bootstrap b = new Bootstrap();
27             b.group(workerGroup);
28             b.channel(NioSocketChannel.class);
29             b.option(ChannelOption.SO_KEEPALIVE, true);
30             b.handler(new ChannelInitializer<SocketChannel>() {
31                 @Override
32                 public void initChannel(SocketChannel ch) throws Exception {
33                     // 客户端接收到的是httpResponse响应,所以要使用HttpResponseDecoder进行解码
34                     ch.pipeline().addLast(new HttpResponseDecoder());
35                     // 客户端发送的是httprequest,所以要使用HttpRequestEncoder进行编码
36                     ch.pipeline().addLast(new HttpRequestEncoder());
37                     ch.pipeline().addLast(new HttpClientInboundHandler());
38                 }
39             });
40
41             // Start the client.
42             ChannelFuture f = b.connect(host, port).sync();
43
44             URI uri = new URI("http://127.0.0.1:8844");
45             String msg = "Are you ok?";
46             DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET,
47                     uri.toASCIIString(), Unpooled.wrappedBuffer(msg.getBytes("UTF-8")));
48
49             // 构建http请求
50             request.headers().set(HttpHeaders.Names.HOST, host);
51             request.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
52             request.headers().set(HttpHeaders.Names.CONTENT_LENGTH, request.content().readableBytes());
53             // 发送http请求
54             f.channel().write(request);
55             f.channel().flush();
56             f.channel().closeFuture().sync();
57         } finally {
58             workerGroup.shutdownGracefully();
59         }
60
61     }
62
63     public static void main(String[] args) throws Exception {
64         HttpClient client = new HttpClient();
65         client.connect("127.0.0.1", 8844);
66     }
67 }

4.HttpClientInboundHandler

 1 package nettyHttpTest;
 2
 3 import io.netty.buffer.ByteBuf;
 4 import io.netty.channel.ChannelHandlerAdapter;
 5 import io.netty.channel.ChannelHandlerContext;
 6 import io.netty.handler.codec.http.HttpContent;
 7 import io.netty.handler.codec.http.HttpHeaders;
 8 import io.netty.handler.codec.http.HttpResponse;
 9
10 public class HttpClientInboundHandler extends ChannelHandlerAdapter {
11
12     @Override
13     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
14         if (msg instanceof HttpResponse)
15         {
16             HttpResponse response = (HttpResponse) msg;
17             System.out.println("CONTENT_TYPE:" + response.headers().get(HttpHeaders.Names.CONTENT_TYPE));
18         }
19         if(msg instanceof HttpContent)
20         {
21             HttpContent content = (HttpContent)msg;
22             ByteBuf buf = content.content();
23             System.out.println(buf.toString(io.netty.util.CharsetUtil.UTF_8));
24             buf.release();
25         }
26     }
27 }

服务器

客户端

时间: 2024-12-11 14:43:40

(中级篇 NettyNIO编解码开发)第十章-Http协议开发应用(基于Netty的HttpServer和HttpClient的简单实现)的相关文章

(中级篇 NettyNIO编解码开发)第十章-Http协议开发应用

HTTPC超文本传输协议〉协议是建立在TCP传输协议之上的应用层协议,它的发展是万维网协会和Internet工作小组IET'F合作的结果.HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过多年的使用和发展,得到了不断地完善和扩展.由于HTTP协议是目前Web开发的主流协议,基于HTTP的应用非常广泛,因此,掌握HTTP的开发非常重要,本章将重点介绍如何基于Netty的HTTP协议技进行HTTP服务端和客户端开发.由于Netty的

各种音视频编解码学习详解

各种音视频编解码学习详解 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,删减版

视音频编解码基本术语及解释

摘要:          整理了一些基本视音频术语,用于入门和查询使用. H264: H264是视频的标准,是MPEG4-10,基于内容的高效编码方式. H.264/MPEG-4第10部分,或称AVC(AdvancedVideo Coding,高级视频编码),是一种视频压缩标准,一种被广泛使用的高精度视频的录制.压缩和发布格式.第一版标准的最终草案于 整理了一些基本视音频术语,用于入门和查询使用. H264: H264是视频的标准,是MPEG4-10,基于内容的高效编码方式. H.264/MPE

基于Netty的私有协议栈的开发

基于Netty的私有协议栈的开发 书是人类进步的阶梯,每读一本书都使自己得以提升,以前看书都是看了就看了,当时感觉受益匪浅,时间一长就又还回到书本了!所以说,好记性不如烂笔头,以后每次看完一本书都写一些读后感,对于技术书则把对让自己醍醐灌顶的篇章记录下来,以便以后翻阅查看,也是记录自己学习的过程- _ -. OK!言归正传,最近由于公司需要做一个网关项目,需要用到基于TCP/IP私有协议接收数据,看完了<Netty权威指南>这本书,感觉作者写的很好,有些地方让我获益良多,虽然书上有些例子跑不通

SOAP协议和基于SOAP的开发流程详述

[文章摘要] 简单对象访问协议(SOAP)是交换数据的一种协议规范,是一种轻量的.简单的.基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息. 在实际的软件开发项目中,SOAP大多用于处理用户数据,也即实现开户.销户.改户和查户等功能. 本文根据作者实际从事过的基于SOAP的项目开发,对SOAP协议和基于SOAP的开发流程进行了详细的介绍.希望大家通过此文,能够对基于SOAP协议的开发有一个全面的了解. 一.soapUI和SOAP代码生成框架简介 "工欲善其事,必先利其器"

iOS开发网络篇之Base64编解码

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 在iPhone开发中很多时候都需要将数据进行Base64编解码. 在一些大项目中,就需要将通过R

Android音频开发(5):音频数据的编解码

前面四篇文章分别介绍了音频开发必备的基础知识.如何采集一帧音频.如何播放一帧音频.如何存储和解析wav格式的文件,建议有兴趣的小伙伴们先读一读,本文则重点关注如何对一帧音频数据进行编码和解码. 1. Android 官方的 MediaCodec API 首先,我们了解一下 Android 官方提供的音频编解码的 API,即 MediaCodec 类,该 API 是在 Andorid 4.1 (API 16) 版本引入的,因此只能工作于 Android 4.1 以上的手机上. 1.1 MediaC

各种与视频编解码以及视频图像处理的应用相关的新技术,新方法,各种软件开发相关的算法,思想。

1. 各种视频压缩标准(MPEG2, MPEG4, H261/2/3/4,X264, T264以及H264(AVC)和HEVC(H265)等的优化,改进,创新. 2. 各种不同平台的(CPU, GPU, DSP, ARM等等)开发,移植优化等, 涉及到的语言包括C, C++, X86汇编,TI DSP汇编,ADI DSP汇编, ARM汇编(armv4/v5/v6/v7 XSCALE WMMX cortex A8等),MMX, SSE, SSE2/3等, 以及目前利用OpenCL来调用GPU实现并

(入门篇 NettyNIO开发指南)第三章-Netty入门应用

作为Netty的第一个应用程序,我们依然以第2章的时间服务器为例进行开发,通过Netty版本的时间服务报的开发,让初学者尽快学到如何搭建Netty开发环境和!运行Netty应用程序. 如果你已经熟悉Netty    的基础应用,可以跳过本章,继续后面知识的学习.本章主要内容包括:.Netty开发环境的搭建.服务端程序TimeServer开发.客户端程序TimeClient开发时间服务器的运行和调试 3.1    Netty开发环境的搭建 首先假设你已经在本机安装了JDKI.7贯配置了JDK的环境