网络协议 http

HTTP协议详解(真的很经典)

User-Agent
我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际 上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它 属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息 了。

 全站 HTTPS 来了

网络抓包工具

httpwatch 下载地址

HttpWatch手把手图解教程 

从IE的“查看”—“浏览器栏”—“HttpWatch”启动HttpWatch。

火狐浏览器自带抓包插件及httpWatch9.1安装软件+教程

抓包工具 - HttpWatch(功能详细介绍)

一步一步开发sniffer(Winpcap+MFC)(一)工欲善其事,必先配环境——配置winpcap开发环境

CloseableHttpAsyncClient最大连接数的问题

CloseableHttpAsyncClient默认方式初始化

CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();

这种方式下最大连接数只有10,单主机的最大连接数只有5,在搞并发的情况下延迟会显著加大。

如果需要高并发环境那么应该手动设置最大连接数以及单主机的连接数:

 CloseableHttpAsyncClient httpclient = HttpAsyncClientBuilder.create()
        .setMaxConnTotal(1000).setMaxConnPerRoute(1000).build();

慎用AsyncTask

       对操作系统有实际接触的读者应该能想明白,CPU的切换是个频繁的过程,“在Linux中可以使用vmstat来观察上下文切换的次数,一般来说,空闲的系统,每秒上下文切换次数大概在1500以下。”,也就是在其他线程做耗时操作,并不会阻塞UI线程。我的担心显然是多虑的。
        但当时我没有想通这一点,就在doInBackground()里,在耗时的操作(如读取数据库、同步网络请求)之间都加了Thread.sleep()操作,以主动让出CPU。试了下,根据上面的分析,结果当然是失败的。
       
        不气不馁,根据现象3,又脑洞大开,想是否是AsyncHttpClient同步网络请求时,由于非Looper线程,导致回调执行是在UI线程中,造成了UI线程的阻塞?想到就做,我直接将AsyncTask改成IntentService实现,试了下,不卡顿了,oh yeah!但同时引入新的问题,通讯录的操作没执行,想了下,it's nothing, Service组件是要声明在AndroidManifest.xml中的,试了下,两个问题都完美解决!
 
        如果止步于此,那就太low了,看了下AsyncHttpResponseHandler的代码,发现如果在非Looper线程中执行,那回调的代码就在执行网络请求(HttpClient.execute())的线程中执行。而且,我用的是同步请求,网络请求直接在发起网络请求(AsyncHttpClient.post())的线程中执行。也就是网络请求、网络请求的回调处理都是在AsyncTask的doInBackground()的线程中执行的。也就不存在回调在UI线程执行,造成UI线程阻塞的问题。
 

弱网下移动端网络连接处理策略

APP弱网络条件下,体验优化之道

iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

弱网或无网状态下 APP如何做缓存

解决Android httpclient网络post/get请求性能优化

  1. // 请求超时   
  2.             HttpConnectionParams.setSoTimeout(params, 15000);  
  3.             HttpConnectionParams.setTcpNoDelay(params, true);//nagle算法默认是打开的,会引起delay的问题;所以要手工关掉。  
  4.             HttpConnectionParams.setConnectionTimeout(params, 15000);  

Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比  good

OkHttp是一个现代,快速,高效的Http client,支持HTTP/2以及SPDY(SPDY介绍网址:https://zh.wikipedia.org/wiki/SPDYSPDY(发音如英语:speedy),一种开放网络传输协议,由Google开发),它为你做了很多的事情。

OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和HTTP缓存。

支持SPDY,可以合并多个到同一个主机的请求

OkHttp实现的诸多技术如:连接池,gziping,缓存等就知道网络相关的操作是多么复杂了。

OkHttp扮演着传输层的角色。

OkHttp使用Okio来大大简化数据的访问与存储,Okio是一个增强 java.io 和 java.nio的库。

OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。

OkHttp还处理了代理服务器问题和SSL握手失败问题。

OkHttp是一个Java的HTTP+SPDY客户端开发包,同时也支持Android。需要Android 2.3以上

OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。

默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。

如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。

从Android4.4开始HttpURLConnection的底层实现采用的是okHttp 

综上得出最终结论:

1、对于新的应用程序,应该更加偏向于使用HttpURLConnection因为在以后的工作当中Google也会将更多的时间放在优化HttpURLConnection上面。

谷歌自己也是推荐用HttpUrlConnection,对它进行了大量的优化,这个从安卓的帮助文档可以看出来:

http://developer.android.com/reference/java/net/HttpURLConnection.html

2、对于已经成熟的应用, Volley停止了更新,而OkHttp得到了官方的认可,并在不断优化。

因此我建议使用OkHttp,现在最新稳定版为3.2.0 

http statusCode(状态码) 200、300、400、500序列

FNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager

理解TCP/IP网络栈&编写网络应用(上)

理解TCP/IP网络栈&编写网络应用(下)

使用AFNetwroking请求错误 输出Bug

使用httpclient必须知道的参数设置及代码写法、存在的风险

原文地址:https://www.cnblogs.com/dqxu/p/5062577.html