文章目录

  • HTTP
    • HTTP请求过程
    • 1. 无状态
    • 2. 基于TCP协议
      • 心跳包
    • 3. 长、短连接
    • 4. 单向请求
  • 传统服务器推送技术
    • 短轮询 polling
      • 同源限制
      • 跨域资源共享
    • 长轮询 long polling
  • 新型推送技术 WebSocket
    • 优点
  • SSE Server-Sent Events
短轮询 长轮询 Websocket Server-Sent Events
通信协议 http http 握手:http --> websocket http
触发方式 Js Ajax Js Ajax 事件 事件
优点 兼容性好容错性强,实现简单 比短轮询节约资源 全双工通讯协议,性能开销小、安全性高,有一定可扩展性 实现简便,开发成本低
缺点 页面会出现‘假死’, 不必要的网络传输 保持连接会消耗资源,服务器没有返回有效数据,程序超时 传输数据需要进行二次解析,增加开发成本及难度 只适用高级浏览器
适用范围 B/S服务 B/S服务 实时性高的应用 服务器向客户端推送

HTTP

  • HTTPHyperText Transfer Protocol)超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议.
  • HTTP 是一个简单的请求-响应协议,是客户端和服务端之间请求和应答的标准,它通常运行在 TCP(传输控制协议)之上,由统一资源标识符(Uniform Resource Identifiers,URI 包含 URL 和 URN )来标识。

HTTP请求过程

  1. URL匹配和DNS解析
  2. 建立TCP连接:三次握手
  3. 发送请求
  • 请求报文分为请求行、请求头、空行和请求体,
  • 服务端通过请求行和请求头中的内容获取客户端的信息,
  • 通过请求体中的内容获取客户端传过来的数据
  1. 响应应答
  • 响应报文由状态行、响应头、空行和响应体组成,
  • 服务端通过状态行和响应头告诉客户端请求的状态和如何对数据处理等信息,
  • 真正的数据则在响应体中传输给客户端。
  1. 断开TCP连接:四次挥手

1. 无状态

  • HTTP请求是无状态的,即没有记忆功能,不能获取之前请求或响应的内容。
  • 起初这种简单的模式,能够加快处理速度,保证协议的稳定,
  • 但是随着应用的发展,这种无状态的模式会使我们的业务实现变得麻烦,
  • 比如说需要保存用户的登录状态,就得专门使用数据库来实现。
  • 于是乎,为了实现状态的保持,引入了Cookie技术来管理状态。
  1. Cookie
  • Server生成,Client/brower存储
  • Client再次请求Server,携带Cookie,Server检查cookie辨识用户
  • Cookie就是服务器给用户颁布的一个状态值,并且保存在客户端或浏览器。只要在cookie的有效期内,用户再次访问该服务器时,浏览器会检查本地的cookies,并且会自动将cookie加在请求头部中一起发送给服务器,服务器通过识别该cookie来辨别用户身份,并且将用户在服务器中的资源提供给用户
  1. Session
  • Server生成,Server存储
  • 保存用户的状态信息,标示并跟踪用户
  1. Session、Cookie关系
  • cookie 是一个实际存在的、具体的东西,http 协议中定义在 header 中的字段。
  • session 是一个抽象概念、开发者为了实现中断和继续等操作,将client和server之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。
  • 即session描述的是一种通讯会话机制,而cookie只是目前实现这种机制的主流方案里面的一个参与者,它一般是用于保存session ID
  • 只能客户端向服务器端发起请求
1. 请求头Accept:告诉服务器当前浏览器能接受和处理的介质类型,*/*表示可接受所有类型。
Accept-Encoding:告诉服务器当前浏览器支持的内容编码。
Accept-Language:告诉服务器当前浏览器能接受和处理的语言。上述请求中的zh-CN,zh;q=0.8表示用户对zh-CN的喜好程度为80%。
Connection:keep-alive,告诉服务器在完成本次请求的响应后,保持该TCP连接不释放,等待本次连接的后续请求。这样可以减少打开关闭TCP连接的次数提升处理性能。另外的可选项是Close,表明直接响应接受完成后直接将其关闭。
Content-Length:用于描述HTTP消息实体的传输长度。
Content-Type:内容类型,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。Cookie:表示服务器端为本次访问分配了一个Session ID,每次发送请求时都会主动将该Session ID通过Cookie字段又发送回服务器,用于验证身份和保持状态。
Host:描述请求将被发送的目的地,在任何类型的请求中都会包含此信息。
Origin:用来说明请求从哪里发起的。
Referer:指定发起该请求的源地址。根据该值服务器可以追踪到来访者的基本信息。比如我们在百度首页搜索博客园关键字,并从搜索结果中访问,那么博客园网站服务器就可以根据Referer值追踪到来访者地址为:https://www.baidu.com/link?url…7c64da001b54df000000065e06ec91 这样就可以知道来访者是从哪个网站访问到此。如果来访者的Referer为空,有两种可能,一种是来访者修改了请求,删除了Referer字段的值,另一种就是来访者是直接在URL地址栏输入地址访问该网站。
TE:采用何种传输编码。
User-Agent:是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核等信息的标识。
X-Requested-With:用来判断请求是Ajax请求还是其他请求。2.请求体POST请求通过请求体来传递数据,通过param1=value1&param2=value2的键值对形式编码。
GET请求通过URL地址参数来传递数据,也就是我们平时看到的URL地址里面“?”后面的所包含的键值对3.状态码1XX:参考信息
2XX:状态成功
3XX:用于重定向
4XX:客户端错误
5XX:服务器端错误4. 响应头1.Cache-Control(对应请求中的Cache-Control)Cache-Control:private 默认为private  响应只能够作为私有的缓存,不能再用户间共享Cache-Control:public 浏览器和缓存服务器都可以缓存页面信息。Cache-Control:must-revalidate  对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时。Cache-Control:no-cache  浏览器和缓存服务器都不应该缓存页面信息。Cache-Control:max-age=10  是通知浏览器10秒之内不要烦我,自己从缓冲区中刷新。Cache-Control:no-store 请求和响应的信息都不应该被存储在对方的磁盘系统中。
2.Content-TypeContent-Type:text/html;charset=UTF-8 告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。
3.Content-EncodingContent-Encoding:gzip 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。
4.DateDate: Tue, 03 Apr 2018 03:52:28 GMT 这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。
5.ServerServer:Tengine/1.4.6  这个是服务器和相对应的版本,只是告诉客户端服务器信息。
6.Transfer-EncodingTransfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了。
7.ExpiresExpires:Sun, 1 Jan 2000 01:00:00 GMT 这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有Cache-Control:max-age=*这个响应头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确。
8.Last-ModifiedLast-Modified: Dec, 26 Dec 2015 17:30:00 GMT 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)
9.ConnectionConnection:keep-alive 这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。
10.EtagETag: "737060cd8c284d8af7ad3082f209582d" 就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了。
11.RefreshRefresh: 5; url=http://baidu.com  用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向。
12.Access-Control-Allow-Origin Access-Control-Allow-Origin: *   *号代表所有网站可以跨域资源共享,如果当前字段为*那么Access-Control-Allow-Credentials就不能为trueAccess-Control-Allow-Origin: www.baidu.com 指定哪些网站可以跨域资源共享
13.Access-Control-Allow-MethodsAccess-Control-Allow-Methods:GET,POST,PUT,DELETE  允许哪些方法来访问
14.Access-Control-Allow-CredentialsAccess-Control-Allow-Credentials: true  是否允许发送cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。如果access-control-allow-origin为*,当前字段就不能为true
15.Content-RangeContent-Range: bytes 0-5/7877 指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。作者:晴天~ ☀
链接:https://juejin.cn/post/6844903745004765198
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。5. 响应体响应体就是服务器返回的HTML页面或者json数据

2. 基于TCP协议

  • HTTP是应用层协议,所以其数据传输部分是基于TCP协议实现的。
心跳包
  • 保活
  • 检测死链
  • 心跳包机制设计详解
  1. TCP keep-alive
  • 传输层:TCP心跳包机制,即选项 SO_KEEPALIVE
  • 系统默认是设置的2小时的心跳频率
  • 但检查不到机器断电、网线拔出、防火墙这些断线
  • 尽管TCP有SO_KEEPALIVE,
  • 但是
  • 默认的tcp keep-alive超时时间太长(2h)
  • socks proxy会让tcp keep-alive失效
    (socks协议只管转发TCP层具体的数据包,而不会转发TCP协议内的实现细节的包)
  • 只能判定对端的TCP连接是否正常,无法判断其他异常情况
  • 移动网络需要信令保活 – 不明白
  • 所以 – 通常服务器上层都会自己设计心跳机制
  1. 应用层 heart-beat (心跳包)
  • 每隔一段时间向对端发送一个较小的数据包,通知对方自己在线,并传输一些可能必要的数据(如告诉服务器该数据包为心跳包),并且定时检测对端返回的数据,若连续几次在规定时间内均未收到回复,则判断对端掉线,可以做下一步处理。该方法适合用于客户端处理,在应用层开一个线程发送心跳包

3. 长、短连接

  • 是否可以认为http没有连接,这一说法??

  • 根本原因是 TCP 的长短连接??

  • HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP连接就结束了,或者更准确的说,是本次HTTP请求就结束了,根本没有长连接这一说。那么自然也就没有短连接这一说了。

  • 之所以网络上说HTTP分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说。

作者:左潇龙
原文地址:http://www.cnblogs.com/zuoxiaolong/p/life49.html

  • 浏览器将通过TCP/IP协议与指定的服务器建立连接
  • HTTP支持持久连接,在HTTP / 0.9和1.0中,连接在单个请求/响应对之后关闭
  • 在HTTP / 1.1中,引入了保持活动机制,其中连接可以重用于多个请求
  • 这样的持久性连接可以明显减少请求延迟,因为在发送第一个请求之后,客户端不需要重新协商TCP 3-Way-Handshake连接。另一个积极的副作用是,通常,由于TCP的缓慢启动机制,连接随着时间的推移而变得更快。

——HTTP_百度百科

  • HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
  • 使用短连接时,HTTP协议不能保存连接状态,每次连接只处理一个请求,用完即断,从而达到节约传输时间、提高并发性。在TCP连接断开之后,客户端和服务端就像陌生人一样,下次再发送请求,就得重新建立连接。有时候,当我们需要发送一段频繁的请求时,这种无连接的状态反而会耗费更多的请求时间(因为建立和断开连接本身也需要时间)
  • HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive
  • 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接
  • HTTP2.0新特性:多路复用 (Multiplexing),二进制分帧,首部压缩(Header Compression),服务端推送(Server Push)
  • 无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。即使http在无状态下,只要客户端和服务器的头部信息connection:keep-alive,则在有效期内他们使用同一条TCP连接
  • HTTP长连接:复用TCP连接

个人总结·:

  • HTTP是应用层协议,基于请求-响应模式
  • 长短连接本质是传输层的TCP协议,建立的TCP连接
  • 短连接:一次TCP连接只传输一个请求/响应对后,就关闭连接
  • 长连接:一次TCP连接可保持,持久使用,传输多个请求/响应对

4. 单向请求

  • HTTP请求是单向的,是只能由客户端发起请求,由服务端响应的请求-响应模式

传统服务器推送技术

短轮询 polling

  • 客户端定时向服务器发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接
同源限制
  • 同源限制是浏览器的安全策略之一,为了保证用户信息的安全,防止恶意的网站窃取数据
  • 同源:相同的协议、域名、端口,否则称为“跨域
  • URL由协议、域名、端口和路径组成
  • 个人理解:访问同一服务器同端口提供的服务没有同源限制,限制的是不同服务之间不能交叉
  • 最初的同源限制是指 A 网站在客户端设置的 Cookie,B网站是不能访问的
  • 这个很好理解,防止伪装用户,窃取信息
  • 随着互联网的发展,同源政策也越来越严格
  • 其中有一项规定就是无法向非同源地址发送Ajax 请求,如果请求,浏览器就会报错 (所以 基于http协议的轮询方式,具有同源限制)
  • 个人理解:同cookie类似,B网站如果写恶意脚本请求已经处于登录状态的A网站的资源,这种情况是应该被拒绝的
跨域资源共享
  • 同源限制Solution:跨域(domain)读取资源
  • CORS (Cross-Origin Resource Sharing,跨域资源共享)
  1. 当你要发起一个跨域请求时,你的请求头里需要带上Origin头,表明你这个请求来自哪个域
  2. 浏览器将CORS请求分成两类:简单请求和非简单请求
  3. 服务端在收到这个请求头的时候,会返回一个access-control-allow-origin头,这个头的值会表明目标服务器是否接受这个跨域请求,如果目标服务器接受这个跨域请求,浏览器就会接受响应,否则浏览器就丢弃这个响应

长轮询 long polling

  • 客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求
  • 回调函数内再次请求Ajax

长短连接/轮询区别:

  1. 决定的方式,一个TCP连接是否为长连接,是通过设置HTTP的Connection Header来决定的,而且是需要两边都设置才有效。而一种轮询方式是否为长轮询,是根据服务端的处理方式来决定的,与客户端没有关系。
  2. 实现的方式,连接的长短是通过协议来规定和实现的。而轮询的长短,是服务器通过编程的方式手动挂起请求来实现的
  • 轮询是网站为了实现推送技术的传统模式。
  • 轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。
  • 这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

新型推送技术 WebSocket

  • WebSocket 是独立的、创建在 TCP上的协议。
  • 首先是 通过HTTP/1.1 协议的101状态码(Switching Protocols)进行握手
  • 即 客户端先向服务器发送http upgrade request,然后服务器响应http 101 response,即 先使用http协议“握手”,完成应用层协议从httpwebsocket的升级

优点

  • 较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。HTTP请求每次都要携带完整的头部
  • 更强的实时性。由于协议是全双工的,服务器可以随时主动给客户端下发数据。
  • 有状态,通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
  • 没有同源限制,客户端可以与任意服务器通信
  • Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
  • 可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
    更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

websocket 为什么没有同源限制?

  • 因为websocket使用类似ws://这样的方式进行连接,并不是使用http协议进行数据传输。
  • 所以浏览器的SOP无法限制它。
  • 而且websocket本来就是设计成支持跨域访问的协议的。
  • 在websocket请求的请求头中会像CORS一样加入origin字段,服务端可以根据这个字段来判断是否通过该请求。
HTTP2.0 与 Websocket> HTTP协议和WebSocket协议都是应用层的协议,两者应用场景不一样
> HTTP主要用来一问一答的方式交付信息
> WebSocket让通信双方都可以主动去交换信息
> HTTP/2虽然支持服务器推送资源到客户端,但那不是应用程序可以感知的,
> 主要是**让浏览器(用户代理)提前缓存静态资源**,所以我们不能指望HTTP2可以像WebSocket建立双向实时通信。作者:贝叶斯
链接:https://www.zhihu.com/question/32039008/answer/1127422609
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

SSE Server-Sent Events

  • 服务器端单向推送,自动更新

1.什么是Http无状态?Session、Cookie、Token三者之间的区别
2. 简述HTTP请求过程
3. Ajax长轮询、轮询应用和介绍
4. 实时消息推送整理
5. HTTP协议的Keep-Alive 模式

注意

  • 如您发现本文档中有错误的地方,
  • 或者您发现本文档中引用了他人的资料而未进行说明时,请联系我进行更正。
  • 转载或使用本文档时,请作说明。
  • 非常感谢:)

HTTP Websocket 服务器推送消息相关推荐

  1. 服务器推送消息方法总结及实现(java)

    服务器推送消息方法总结及实现(java) 最近在进行web开发时,有用到服务端推送消息这个功能,相信大家在平常开发时,也经常会有这种需求.本文对常用的几种服务器推送消息方法进行整理和总结,并实现使用流 ...

  2. html5服务器推送消息的各种解决办法,WEB服务器推送消息的各种解决办法

    前言:在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知.而BS架构本身存在的问题就是,服务器一直采用的是一问一答的机制.这就意味着如果 ...

  3. Netty实战,Springboot + netty +websocket 实现推送消息

    开发者(KaiFaX) 面向全栈工程师的开发者专注于前端.Java/Python/Go/PHP的技术社区 来源 | blog.csdn.net/weixin_44912855 学过 Netty 的都知 ...

  4. worker服务器推送消息,浏览器中serviceWorker用法

    朋也的博客 » 首页 » 文章 浏览器中serviceWorker用法 作者:朋也 日期:2019-05-27 类别:javascript学习笔记 版权声明:自由转载-非商用-非衍生-保持署名(创意共 ...

  5. java服务器推送消息技术

    其实有很多种方式实现服务器推送,它们各有各的优缺点: 1.传统轮询:此方法是利用 HTML 里面 meta 标签的刷新功能,在一定时间间隔后进行页面的转载,以此循环往复.它的最大缺点就是页面刷性给人带 ...

  6. asp服务器推送消息,asp.net实时向客户端推送消息(SignalRWeb)

    [实例简介]ASP.net中服务器端向客户端推送消息,多用于在线聊天 [实例截图] [核心代码] using System; using System.Collections.Generic; usi ...

  7. worker服务器推送消息,关于Worker如何向指定Client推送消息

    use Workerman\Worker; require_once './Workerman/Autoloader.php'; // 初始化一个worker容器,监听1234端口 $worker = ...

  8. netty多台服务器 推送消息,基于Netty的消息推送服务器集群设计与实现

    徐龙光 何顶新 摘 要:消息推送是当前移动应用中十分必要的一项技术,服务者需要使用消息推送以保持用户活跃度,提高应用存留率.为了满足消息推送的需求和增强推送系统的性能,采用Netty网络编程框架并搭建 ...

  9. 手机 服务器 推送消息推送消息,推送信息到手机的pushover使用方法及sample code

    今天给大家介绍一个好东西,用了两年多了,一直没时间给大家推荐.pushover,移动端的信息推送服务API,包括使用.设置以及API实现. 用途 在关键节点放上推送(比如用户注册.举报.评论,系统检测 ...

最新文章

  1. postgre 常用语法,如 group_concat用法
  2. K-BERT | 基于知识图谱的语言表示模型
  3. db2 jdbc连接字符串中 指定currentSchema
  4. 计算机里的网络是什么意思啊,计算机网络中本地站点是什么意思
  5. 一加WarpTen技术今日发布:全新旗舰一加7将搭载
  6. 读书笔记(4)——python爬取糗事百科,并存到MySQL中
  7. sklearn 数据预处理1: StandardScaler
  8. PKCS #1 RSA Encryption Version 1.5
  9. 迅雷远程服务器连接失败是什么原因,迅雷远程页面常见错误码及处理.docx
  10. Android音频压缩分析
  11. 基础架构即服务(iaas)_基础架构即服务
  12. 英雄无敌服务器维护,英雄无敌王国服务器地图攻略
  13. espnet中的transformer和LSTM语言模型对比实验
  14. android deb文件怎么打开,演示apk是什么文件?怎么打开apk文件呢?
  15. Spotify大规模敏捷之路
  16. matlab中给信号添加高斯白噪声的两种方法,awgn计算过程,randn函数
  17. 扩展DailyRollingFileAppender使其支持限定日志文件的数量
  18. 华三服务器R6900系统安装,H3C UniServer R6900 G5服务器支持智能管理模块等多种运维工具...
  19. THWATCH-01 陀螺仪 MPU6050 HAL库 正点原子 STM32驱动 计步
  20. mysql乾坤大挪移A库下的表去B库

热门文章

  1. chrome 设置与技巧
  2. linux如何删除创建的用户组,Linux 学习之用户,组的创建以及删除
  3. 电容笔和Apple pencil区别有哪些区别?苹果笔替代笔推荐
  4. python实现一个简单的ping工具
  5. 反爬好友--IP池之分析各类代理IP网站
  6. shell脚本mysql清空指定数据库表数据(排除指定库表不清空)
  7. 20200227之高斯日记
  8. java 获取Excel单元格内颜色
  9. JavaScript属性操作 1
  10. 全球与中国路边LED广告屏市场深度研究分析报告