Http协议是基于TCP/IP之上的一个协议
Http协议永远是客户端发起请求,服务器回送响应。
Http协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的。
TCP三次握手:
客户端(请求)synchronous服务器(返回)acknowledgement+synchronous客户端(响应)acknowledgement
Http请求的方式:
GET:获取Request-URL所标识的资源。
POST:在Request-URL所标识的资源后附加新的数据。
HEAD:请求获取由Request-URL所标识的资源的响应消息报头。
PUT:请求服务器存储一个资源。并用Request-URL作为其标识。
DELETE:请求服务器删除Request-URL所标识的资源
TRACE:请求服务器回送收到的请求信息,主要用于测试或者诊断。
CONNECT:保留将来使用
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和。
Http响应码:
200 OK//表示客户端请求成功
400 Bad request//客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized//请求未经授权
403 Forbidden //服务器收到请求但是拒绝提供服务。
404 Not Found //请求资源不存在 eg:输入错误的URL
500 Internal Server Error //服务器发生不可预知的错误
503 Server Unavailable//服务器当前不能处理客户端的请求,一段时间后可以恢复正常。
Http协议的主要特点:
1:支持客户/服务器模式
2:简单快速:客户端向服务器端发送请求时,只发送相应的路径和请求方法,请求方法有:GET,POST,HEAD。每种方法规定了客户与服务器连接的类型不同。由于Http协议简单,所以规模小,导致连接速度很快。
3:灵活,Http允许传输任意数据类型的对象,并由Content-type加以标明。
4:无连接。无连接的含义是限制客户端与服务器的每一次连接只处理一个请求。这种方式可以节省传输时间。
5:无状态。无状态指的是协议对于事务处理没有记忆能力,如果后续需要处理前面的信息,必须重传。
网络系统结构:
(7层参考模型)
Open system interconnection (OSI)
网络通信功能分为七个层次:
(由高到低)
应用层(A)
表示层(p)
会话层(s)
传输层(T)
网络层(N)
数据链路层(DL)
物理层(PH)
TCP/IP 4层协议
(由高到低)
应用层(ftp,telnet)
传输层(tcp,udp)
网络层
主机到网络层
Http1.0和Http1.1协议的区别:
1.0每次请求都需要建立新的TCP连接。连接不可服用。
1.1请求建立在上次的TCP协议之上发送,减少了重复进行三次握手的开销,提高了效率。
1.1在Request消息头上多加了一个Host域。1.0则没有这个域。
1.1增加了OPTION,PUT,DELETE,TRACE,CONNECT这些Request方法。
使用webView访问百度首页的实例:
MainActivity.java
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
private WebView webView;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webV_1);
new HttpThread("https://www.baidu.com",webView,handler).start();
}
}
HttpThread.java
import android.os.Handler;
import android.webkit.WebView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class HttpThread extends Thread{
private String url;
private WebView webView;
private Handler handler;
public HttpThread(String url,WebView webView,Handler handler){
this.url =url;
this.webView =webView;
this.handler =handler;
}
@Override
public void run() {
try {
URL httpurl = new URL(url);
HttpURLConnection connection;
connection = (HttpURLConnection) httpurl.openConnection();
connection.setReadTimeout(5000);
connection.setRequestMethod("GET");
final StringBuffer sb = new StringBuffer();
BufferedReader br =new BufferedReader(new InputStreamReader(connection.getInputStream()));
String str;
while ((str = br.readLine()) != null){
sb.append(str);
}
handler.post(new Runnable() {
@Override
public void run() {
webView.loadData(sb.toString(),"text/html;charset=utf-8",null);
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.asong.httpurlconnection.MainActivity">
<WebView
android:id="@+id/webV_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
使用imageView从网上下载一幅图片示例:
MainActivity.java
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView= (ImageView) findViewById(R.id.igv_1);
new HttpThread("http://image.baidu.com/search/detail?ct=503316480&z=&tn=baiduimagedetail&ipn=d&word=%E5%B0%8F%E6%B8%85%E6%96%B0&step_word" +
"=&ie=utf-8&in=&cl=2&lm=-1&st=-1&cs=328539268,1621399685&os=1890035889,1979762442&simid=0,0&pn=8&rn=" +
"1&di=73300851170&ln=1000&fr=&fmq=1459502282690_R&fm=&ic=0&s=undefined&se=&sme=&tab=0&width=&height=" +
"&face=undefined&is=&istype=2&ist=&jit=&bdtype=11&gsm=0&objurl=http%3A%2F%2Fimg3.duitang.com%2Fuploads%2Fitem%" +
"2F201601%2F27%2F20160127192111_YTVGf.jpeg&rpstart=0&rpnum=0&ctd=1465886064174^3_1263X604%1",imageView,handler).start();
}
}
HttpThread.java
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.Handler;
import android.widget.ImageView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class HttpThread extends Thread{
private String url;
private ImageView imageView;
private Handler handler;
public HttpThread(String url,ImageView imageView,Handler handler){
this.url =url;
this.imageView = imageView;
this.handler =handler;
}
@Override
public void run() {
URL httpurl = null;
try {
httpurl = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection connection = (HttpURLConnection) httpurl.openConnection();
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
connection.setDoInput(true);
InputStream in =connection.getInputStream();
FileOutputStream out = null;
File downloadFile =null;
String fileName = String.valueOf(System.currentTimeMillis());
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File parent = Environment.getExternalStorageDirectory();
downloadFile = new File(parent,fileName);
out =new FileOutputStream(downloadFile);
}
byte[] b = new byte[2*1024];
int len;
if (out != null){
while ((len =in.read(b)) !=-1){
out.write(b,0,len);
}
}
final Bitmap bitmap = BitmapFactory.decodeFile(downloadFile.getAbsolutePath());
handler.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.asong.httpurlconnection_1.MainActivity">
<ImageView
android:id="@+id/igv_1"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
/>
</android.support.constraint.ConstraintLayout>
AndroidManifest.XML
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.asong.httpurlconnection_1">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Http传递参数信息和传递方式GET和POST