1. HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是Internet上目前使用最广泛的应用层协议,它基于传输层的TCP协议进行通信,HTTP协议是通用的、无状态的协议。
这几个名词有一种通俗的解释:
- 通讯协议:双方对话的标准
- 通用的:用了都说好,谁用谁知道
- 无状态的:翻脸不认人
- 超文本:除了文本,还可以是音频、视频
2、客户端连接服务器实现内部的原理如下:
分析上图,步骤如下:
- 第一步:在浏览器客户端中得到用户输入的内容。
- 第二步:浏览器得到这个网址之后,内部会将这个域名发送到DNS上,进行域名解析。得到它的IP之后就会链接到指定的服务器上,假如服务器的地址是:221.104.13.32:80,从浏览器到服务器端口它使用到最底层的TCP/IP协议。
- 第三步:实现TCP/IP协议用Socket来完成,使用了Socket的套接字。
- 第四步:服务器端的80端口监听客户端的链接,这样客户端到服务器就链接上了。
- 服务器接收到这些内容之后,并按照这些请求的路径找到对应的页面,进一步找到对应的网页内容,返回给客户端。
通俗一点讲,用户在浏览器输入网址,通过http协议发出去,网址经过DNS域名解析,解析成指定的ip地址,并在80端口上监听用户的请求。服务器监听到请求之后,会以三种方式返回给客户端:HTML、XML、JASON。
三、使用HTTP协议访问网络:
Android中的WebView控件已经在后台帮我们处理好了发送HTTP请求、接收服务响应、解析返回数据,以及最终的页面展示这几步工作,不过由于它封装得太好了,反而不能直观地看出HTTP协议是如何工作的。因此接下来我们通过手动发送HTTP请求的方式,来更加深入的了解这一过程。
在Android上发送HTTP请求的方式一般有两种:HttpURLConnection和HttpCient。我们先来学习HttpCient。
HTTP返回请求数据的三种方式:
- 1、以HTML代码内容返回。
- 2、以XML字符串的形式返回,在以后的android开发中这种形式返回数据比较多。
- 3、以JSON对象形式返回,在网络流量上考虑JSON要比XML方式要好一些,便于解析。
简单来说,用HttpClient发送请求、接收响应都很简单,只需要五大步骤即可:(要牢记)
- 创建代表客户端的HttpClient对象。
- 创建代表请求的对象,如果需要发送GET请求,则创建HttpGet对象,如果需要发送POST请求,则创建HttpPost对象。注:对于发送请求的参数,GET和POST使用的方式不同,GET方式可以使用拼接字符串的方式,把参数拼接在URL结尾;POST方式需要使用setEntity(HttpEntity entity)方法来设置请求参数。
- 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法后,将获得服务器返回的HttpResponse对象。服务器发还给我们的数据就在这个HttpResponse相应当中。调用HttpResponse的对应方法获取服务器的响应头、响应内容等。
- 检查相应状态是否正常。服务器发给客户端的相应,有一个相应码:相应码为200,正常;相应码为404,客户端错误;相应码为505,服务器端错误。
- 获得相应对象当中的数据
http的两种请求方式:POST和GET
由于Android的SDK包含org.apache.http包,所以不用导入jar了
GET方式:
String serverURL = "http://127.0.0.1/xxx/xx.jsp?username=abc; HttpGet httpRequest = new HttpGet(serverURL);// 建立http get联机 HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);// 发出http请求 if (httpResponse.getStatusLine().getStatusCode() == 200) String result = EntityUtils.toString(httpResponse.getEntity());// 获取相应的字符串
POST方式:
String uriAPI = "http://127.0.0.1/xxx/xx.jsp"; //声明网址字符串 HttpPost httpRequest = new HttpPost(uriAPI); //建立HTTP POST联机 List <NameValuePair> params = new ArrayList <NameValuePair>(); //Post运作传送变量必须用NameValuePair[]数组储存 params.add(new BasicNameValuePair("str", "I am Post String")); httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); //发出http请求 HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest); //取得http响应 if(httpResponse.getStatusLine().getStatusCode() == 200) String strResult = EntityUtils.toString(httpResponse.getEntity()); //获取字符串
//方法:发送网络请求,获取百度首页的数据。在里面开启线程 63 private void sendRequestWithHttpClient() { 64 new Thread(new Runnable() { 65 66 @Override 67 public void run() { 68 //用HttpClient发送请求,分为五步 69 //第一步:创建HttpClient对象 70 HttpClient httpCient = new DefaultHttpClient(); 71 //第二步:创建代表请求的对象,参数是访问的服务器地址 72 HttpGet httpGet = new HttpGet("http://www.baidu.com"); 73 74 try { 75 //第三步:执行请求,获取服务器发还的相应对象 76 HttpResponse httpResponse = httpCient.execute(httpGet); 77 //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常 78 if (httpResponse.getStatusLine().getStatusCode() == 200) { 79 //第五步:从相应对象当中取出数据,放到entity当中 80 HttpEntity entity = httpResponse.getEntity(); 81 String response = EntityUtils.toString(entity,"utf-8");//将entity当中的数据转换为字符串 82 83 //在子线程中将Message对象发出去 84 Message message = new Message(); 85 message.what = SHOW_RESPONSE; 86 message.obj = response.toString(); 87 handler.sendMessage(message); 88 } 89 90 } catch (Exception e) { 91 // TODO Auto-generated catch block 92 e.printStackTrace(); 93 } 94 95 } 96 }).start();//这个start()方法不要忘记了 97 98 } 99 }