2021@SDUSC
目录
HttpURLConnection类详细介绍
protected void onPostExecute(String result) {
String tagA="<div class=\"shici_content\">";
String tagB="</";
String tagB2="<a";
String left = tw_page.toString();
Log.i("tt",""+left.length());
int tagai = -1;
tagai = left.indexOf(tagA);
System.out.println("i find tagert"+tagai);
int len = left.length();
if (len > 5000)
tw_ps = "";
while (tagai >= 0) {
left = left.substring(tagai + tagA.length());
int tagbi = left.indexOf(tagB);
int tagb2=left.indexOf(tagB2);
if(tagb2<tagbi){
tagbi=tagb2;
}
if (tagbi >= 0) {
String p1 = left.substring(0, tagbi);
Log.e("TAG",p1);
tw_ps += "<p>" + p1 + "<p>";
}
tagai = left.indexOf(tagA);
}
webView.loadData(tw_ps, "text/html", "utf-8");
}
HttpURLConnection简单说明
HttpURLConnection是一个在JDK的 java.net 包中已经提供了访问HTTP协议的基本功能的类。它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。
HttpURLConnection使用
1、HttpURLConnection对象不能直接构造,需要通过URL类中openConnection()
方法来获得。
2、对HttpURLConnection对象的配置都需要在connect()方法执行之前完成,因为connect()会根据HttpURLConnection对象的配置值生成HTTP头部信息。
HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的TCP连接,并没有实际发送HTTP请求。HTTP请求实际上直到我们获取服务器响应数据(如调用getInputStream()、getResponseCode()等方法)时才正式发送出去。
3、HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。
4、HTTP正文的内容是通过OutputStream流写入的, 向流中写入的数据不会立即发送到网络,而是存在于内存缓冲区中,待流关闭时,根据写入的内容生成HTTP正文。
5、调用getInputStream()方法时,返回一个输入流,用于从中读取服务器对于HTTP请求的返回信息。代码中也使用了该方法。
URL u = new URL("https://www.shicimingju.com/chaxun/zuozhe/28.html");
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
Log.i("tt", "connection successed");
InputStream in = conn.getInputStream();
InputStreamReader r = new InputStreamReader(in);
BufferedReader buffer = new BufferedReader(r);
tw_page = new StringBuffer();
String line = null;
while ((line = buffer.readLine()) != null) {
System.out.println("tw_page_length"+tw_page.toString().length());
tw_page.append(line);
}
}
6、如上代码,可以使用HttpURLConnection.connect()方法手动的发送一个HTTP请求,但是如果要获取HTTP响应的时候,请求就会自动的发起,比如我们使用HttpURLConnection.getInputStream()方法的时候,所以完全没有必要调用connect()方法。
HttpURLConnection长连接
介绍:HttpURLConnection长连接(Keep-Alive)是JDK8自带的HttpURLConnection,默认启用keepAlive,支持HTTP / 1.1和HTTP / 1.0持久连接,使用后的HttpURLConnection会放入缓存中供以后的同host:port的请求重用,底层的socket在keepAlive超时之前不会关闭。
HttpURLConnection受以下system properties控制:
http.keepAlive=(默认值:true),是否启用keepAlive,如果设置为false,则HttpURLConnection不会缓存,使用完后会关闭socket连接。
http.maxConnections=(默认值:5),每个目标host缓存socket连接的最大数。
如果在HttpURLConnection的header中加入Connection: close,则此连接不会启用keepAlive。
启用keepAlive,程序请求完毕后,必须调用HttpURLConnection.getInputStream().close()
表示归还长连接给缓存,以供下次同host:port的请求重用底层socket连接。
不能调用HttpURLConnection.disconnect()
表示关闭底层socket连接,不会启用keepAlive。
keepAliveTimeout首先从http response header中获取,如果没有取到,则默认为5秒,sun.net.www.http.KeepAliveCache.java中有一个线程,每5秒执行一次,检查缓存的连接的空闲时间是否超过keepAliveTimeout,如果超过则关闭连接。从KeepAliveCache中获取缓存的连接时也会检查获取到的连接的空闲时间是否超过keepAliveTimeout,如果超过则关闭连接,并且获取下一个连接,再执行以上检查,直达获取到空闲时间在keepAliveTimeout以内的缓存连接为此。
HttpURLConnection关闭
本身要 HttpURLConnection 是很简单的,调用 connection.disconnect() 就可以了。
这里是想说明一下,是否需要关闭,应该根据实际需要来:
当 HttpURLConnection 是 "Connection: close " 模式,那么关闭 inputStream 后就会自动断开连接。
当 HttpURLConnection 是 “Connection: Keep-Alive” 模式,那么关闭 inputStream 后,并不会断开底层的 Socket 连接。这样的好处,是当需要连接到同一服务器地址时,可以复用该 Socket。这时如果要求断开连接,就可以调用 connection.disconnect() 了。
使用时要注意,HttpURLConnection 连接到底是不是 Keep-Alive 模式,除了 HttpURLConnection 请求设置为 Keep-Alive 外 (http 1.0中默认是关闭的,http 1.1中默认启用Keep-Alive),也需要服务器支持 Keep-Alive,才可以真正建立 Keep-Alive 连接。
HttpURLConnection与HttpClient区别
在一般情况下,如果只是需要向Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任。但在绝大部分情况下,
Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。
在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来较为复杂。
为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,
它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的Javascript代码;也不会对页面内容进行任何解析、处理。
总而言之,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;
HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。