http协议

来源:互联网 发布:access数据库新技术 编辑:程序博客网 时间:2024/05/04 06:42

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请求的方式一般有两种:HttpURLConnectionHttpCient。我们先来学习HttpCient。


HTTP返回请求数据的三种方式:
  • 1、以HTML代码内容返回。 
  • 2、以XML字符串的形式返回,在以后的android开发中这种形式返回数据比较多。 
  • 3、以JSON对象形式返回,在网络流量上考虑JSON要比XML方式要好一些,便于解析。
在Android当中,一般使用xml和Json数据解析。

简单来说,用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             @Override67             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 block92                     e.printStackTrace();93                 }94                 95             }96         }).start();//这个start()方法不要忘记了        97         98     }    99 }



0 0
原创粉丝点击