腹水引流有什么方法,http服务器是什么,服务器组成部分先容

做了多年web开发,http真是熟悉的陌生人(经常在用,然则从头至尾理清晰真的是很有难度的),实在http概述和netty中的http应用真有需要说下,一起聊聊netty实现tomcat的功效,请求服务的功效。

http概述,Netty实现高性能的HTTP服务器

(一)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报文

http概述,Netty实现高性能的HTTP服务器
http概述,Netty实现高性能的HTTP服务器

注: 我们可以通过抓包工具(fiddler)可以直接看到该报文花样。

报文约定好以后两头都需要对其举行解码和编码操作

http概述,Netty实现高性能的HTTP服务器

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服务器内部错误

http概述,Netty实现高性能的HTTP服务器

(二)基于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();
}
}
http概述,Netty实现高性能的HTTP服务器

实现历程剖析

  1. 确立毗邻读取新闻流
  2. 解码Request
  3. 营业处置
  4. 编码Response
  5. 返回新闻关闭毗邻

Channel 与 ChannelPipeline

1.Channel:

a. ServerSocketChannel

b. SocketChannel

2.pipeline:一个pipeline 当中包罗了多个ChandlerHandler,而且是有顺序的

3.ChandlerHandler

a. HttpRequestDecode:解码请求

b. HttpResponseEncode :编码返回效果

在 Netty 中每个 Channel 都有且仅有一个 ChannelPipeline 与之对应, 它们的组成关系如下:

http概述,Netty实现高性能的HTTP服务器

一个 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 当中的示意结构

http概述,Netty实现高性能的HTTP服务器

HttpResponse在netty 当中的结构

http概述,Netty实现高性能的HTTP服务器

PS:说了下http协媾和若何通过netty完成http服务。

本文来源于自互联网,不代表n5网立场,侵删。发布者:虚拟资源中心,转载请注明出处:https://www.n5w.com/120994.html

(0)
打赏 微信扫一扫 微信扫一扫
虚拟资源中心虚拟资源中心网络小白
上一篇 2020年6月21日 21:37
下一篇 2020年6月21日 21:38

相关推荐

联系我们

电话:

在线咨询:点击这里给我发消息

邮件:@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

公众号