进行了很多年web开发,http真的是熟悉的陌生人(常常在使用,可是从头至尾理清晰真的是很有困难的),实际上http概述和netty中的http运用真必须说下,一起聊聊netty完成tomcat的作用,请求服务项目的作用。
(一)Http协议概述
- 1.什么叫Http协议
HTTP是一个属于【网络层】的面向对象编程的协议,因为其简单、迅速的方法,适用分布式系统垂直搜索信息系统软件。
- 2.HTTP协议的主要特点
适用顾客/服务器方式。
简易迅速
顾客向服务器请求服务项目时,只需传递请求方式和途径。请求方式常见的有GET、HEAD、POST。每一种方式要求了用户与
服务器联络的种类不一样。因为HTTP协议简易,促使HTTP服务器的系统经营规模小,因此通讯速率迅速。
灵便
HTTP容许传送随意种类的信息目标。已经传送的种类由Content-Type进行标识。
无联接
无衔接的含意是限定每一次联接只解决一个请求。服务器处理完顾客的请求,并接到用户的回复后,即断开。选用这类方法可以节约传送时长。
无状态
HTTP协议是无状态协议。无状态就是指协议针对事务管理并没有记忆力。缺乏情况代表着假如后面解决必须前边的信息,则它务必重新传输,那样很有可能造成每一次联接传递的信息量扩大。另一方面,在服务器不用此前信息时它的回复就迅速。从HTTP协议而言是无状态的,实际上在使用的情况下,许多状况根据回复的方法也是有情况的。
(二)Http协议互动全过程
协议互动实质就是指协议两边(手机客户端、服务器端),互联网技术上并没有协议是错乱的,正如假如现实生活中并没有法律法规也会弄乱一样。
1.传送数据
传输数据一般根据TCP/IP 完成,反映到编程语言上便是人们所了解的Socket 程序编写。
2.互换数据信息
互换数据信息实质就是指,两边(手机客户端、服务器端)能分别鉴别另一方所上传的数据信息。那麼这就需用制订一套【报文格式编号】文件格式,彼此以该文件格式编码数据发给另一方。
Http 相匹配的Request 与Response报文格式
注: 我们可以根据抓包工具(fiddler)可以同时见到该报文格式。
报文格式承诺好之后两边都要对它进行编解码和编号实际操作
3.Http协议具体内容构成
请求方式
方法叙述GET请求特定的网页页面信息,并回到实体线行为主体。HEAD类似get请求,只不过是回到的响应中并没有详细的具体内容,用以获得报头POST向特定网络资源递交信息完成解决请求(例如表单提交或是文件上传)。数据信息被包括在请求体里。POST请求很有可能会致使新的資源的构建和/或已经有网络资源的改动。PUT从手机客户端向服务器传递的数据信息替代特定的文本文档的具体内容。DELETE请求服务器删掉选定的网页页面。CONNECTHTTP/1.1协议中预埋给可以将联接改成管路方法的代理商服务器。OPTIONS容许手机客户端查询服务器的特性。TRACE回显服务器接到的请求,主要运用于检测或确诊。
一部分请求头
请求头表明Host接纳请求的服务器详细地址,可以是IP:端口,还可以是网站域名User-Agent推送请求的应用软件名字Connection特定与联接有关的特性,如Connection:Keep-AliveAccept-Charset通告服务器端可以推送的编码格式Accept-Encoding通告服务器端可以推送的数据信息压缩格式Accept-Language通知服务器端可以推送的语言表达
一部分响应头
响应头表明Server服务器应用软件手机软件的命名和版本号Content-Type响应文章正文的种类(是照片或是二进制字符串数组)Content-Length实体线报头域用以指出实体线文章正文的长短,以字节数方法储存的十进制数据来表明响应文章正文长短Content-Charset响应文章正文应用的编号Content-Encoding响应文章正文应用的数据信息压缩格式Content-Language响应文章正文应用的语言表达
一部分响应情况
状态码表明200响应取得成功302自动跳转,跳转详细地址根据响应头里的Location特性特定(JSP中Forward和Redirect中间的差别)400手机客户端请求有拼写错误,不可以被服务器鉴别403服务器接受到请求,可是回绝出示服务项目(验证不成功)404请求网络资源不会有500服务器内部错误
(二)根据Netty 完成Http协议全过程剖析
源代码:https://github.com/limingios/netFuture/tree/master/源码/『互联网技术构架』软件体系结构-io与nio进程实体模型reactor模型(上)(53)/nio
Http协议分成三一部分:
1.远程数据传输
2.报文格式编解码
3.业务流程解决
但如果是开发设计根据Http一般运用,彻底没需要反复造轮子,,大家只需完成业务流程就可以。现较为完善的分布式数据库有:Tomcat、Jetty、Jboos。这种正中间有一个缺陷是偏重,假如必须轻巧完成可选用:netty 或JDK自还http 完成JDK Http源代码参照:com.sun.net.httpserver.HttpServer
- netty 完成http
源代码:nio/http中。
1.原始ServerBootstrap
2.根据ChannelInitializer 原始 pipeline
3.根据SimpleChannelInboundHandler HttpServer解决类
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.ServerSocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.http.*;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import java.net.ContentHandler;
import java.util.concurrent.ThreadFactory;
/**
* Created by idig8.com
*/
public class HttpSimpleServer {
//open 运行服务项目
public void openServer() {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.channel(NioServerSocketChannel.class);
EventLoopGroup boss = new NioEventLoopGroup(1);
EventLoopGroup work = new NioEventLoopGroup(8);
bootstrap.childHandler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel ch) throws Exception {
ch.pipeline().addLast(\"http-decoder\", new HttpRequestDecoder());
ch.pipeline().addLast(\"http-aggregator\", new HttpObjectAggregator(65536));
ch.pipeline().addLast(\"http-encoder\", new HttpResponseEncoder());
ch.pipeline().addLast(\"http-server\", new HttpServerHandler());
}
});
bootstrap.group(boss, work);
try {
ChannelFuture future = bootstrap.bind(8080).sync();
System.out.println(\"服务项目运行:8080\");
future.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
boss.shutdownGracefully();
work.shutdownGracefully();
}
}
private static class HttpServerHandler extends SimpleChannelInboundHandler {
@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
response.headers().set(HttpHeaderNames.CONTENT_TYPE, \"text/html;charset=UTF-8\");
String html = \"<!DOCTYPE html>n\"
\"<html lang=\"en\">n\"
\"<head>n\"
\" <meta charset=\"UTF-8\">n\"
\" <title>hello idig8.com</title>n\"
\"</head>n\"
\"<body>n\"
\"hello idig8.comn\"
\"</body>n\"
\"</html>\";
response.content().writeBytes(html.getBytes(\"UTF-8\"));
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
}
}
public static void main(String[] args) {
HttpSimpleServer simpleServer = new HttpSimpleServer();
simpleServer.openServer();
}
}
完成全过程剖析
- 创建联接载入信息流
- 编解码Request
- 业务流程解决
- 编号Response
- 回到信息关掉联接
Channel 与 ChannelPipeline
1.Channel:
a. ServerSocketChannel
b. SocketChannel
2.pipeline:一个pipeline 之中包括了好几个ChandlerHandler,并且是有先后顺序的
3.ChandlerHandler
a. HttpRequestDecode:编解码要求
b. HttpResponseEncode :编号回到结论
在 Netty 中每一个 Channel 都只有一个 ChannelPipeline 与之相匹配, 他们的构成关联如下所示:
一个 Channel 包括了一个 ChannelPipeline, 而 ChannelPipeline 中又维护保养了一个由 ChannelHandlerContext 构成的双向链表. 这一单链表的头是 HeadContext, 链表的尾是 TailContext,而且每一个 ChannelHandlerContext 中又关系着一个 ChannelHandler
bootstrap.childHandler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel ch) throws Exception {
ch.pipeline().addLast(\"http-decoder\", new HttpRequestDecoder());
ch.pipeline().addLast(\"http-aggregator\", new HttpObjectAggregator(65536));
ch.pipeline().addLast(\"http-encoder\", new HttpResponseEncoder());
ch.pipeline().addLast(\"http-server\", new HttpServerHandler());
}
});
HttpRequest 在netty 之中的表明构造
HttpResponse在netty 之中的构造
PS:讲了下http协议和怎样根据netty进行http服务项目。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。