Android 网络协议

在做Android程序时,我们已不再仅仅局限于单机的,而是要能够实现交互。那么Android中的网络协议有什么呢?说白了还是TCP/IP协议簇,他也是最重要的网络协议。

最重要的协议,TCP,UDP,IP,ARP,RARP,HTTP,SMTP,FTP等。

 

ISO七层协议:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。IP协议只保证计算机能发送和接收分组数据,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务,UDP协议提供了不可靠的单向服务。

 

TCP协议:可靠的传输协议,TCP连接的建立需要通过三次握手才行,而且它的传输是可靠的,为什么呢?因为它传输的数据能够毫无差错的到达客户端,因为在物理层传输的时候,是0101010二进制bit流进行传输的,所以通过外部因素可能会导致其中的数据改变,但是因为有数据链路层,保证了数据的透明传输,通过冗余码的检测,会将不对的包丢弃,当数据包不对或者长时间没有收到数据包的话,就会请求服务端进行重传,而且数据包不是一次性全部传输的,是几个包传输,而包的大小也是有MTU(最大传输单元)来决定的,然后客户端接收到了之后保证这些包的数据没错而且按顺序到达了客户端才会进行下一批数据的传输。所以这样就会保证数据的可靠传输,而不会丢失或者包错位了。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到服务端的包的按序接收。然后客户端对已成功收到的字节发回一个相应的确认(ACK);如果客户端在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算和校验

 

UDP协议:不可靠传输协议,UDP的传输只需要通过服务端进行端口监听就行了,UDP包不需要通过三次握手什么的,只需要客户端指定服务端的IP地址,监听端口号就行了,UDP协议不保证数据包中的数据是否正确,和数据包到达的顺序等,到达了,即使是错误的也会接收,没到达也不会请求服务端进行重传,所以通常语音或者视频的时候,用的都是UDP协议,而不会使用TCP协议,因为即使丢失了一部分数据,还是可以进行比较流畅的功能。所以UDP和TCP协议使用的场所不同,各有好坏。

 

总结:TCP:可靠的,面向连接的传输机制,提供了可靠的字节流保证了数据包中数据的完整无损,并且数据包可以按顺序到达。因为数据包的按顺序到达与准确无误,所以它所需要的时间较长。

 

UDP:不可靠的,非面向连接的传输机制,它不检查数据包是否已经到达目的地,并且不保证它们按顺序到达。因为数据包可以不按顺序到达,并且不需要检测是否正确,所以它传输速度快。在数据链路层的时候,如果冗余码不对的话,就会丢弃数据包,无论是UDP还是TCP协议,都会丢弃数据包,只不过TCP协议会请求重传,而UDP协议不会。

 

HTTP协议是基于TCP协议的面向连接的可靠传输协议,所以通过HTTP协议获取到的数据总是能获取到的,通过JAVA中的HTTP类可以通过setProperty来设置HTTP协议的一些参数来达到更高的要求。HTTP协议是一种请求响应的协议,B/S就是这样,浏览器发起一个HTTP请求,向服务器请求通过HTTPGET或者HTTPPOST请求,来请求或者传递数据,服务器会返回请求结果,这就是所谓的请求响应。

本人在项目中最常用的是HTTP协议:

1.超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。  2. java接口 --------java.net.*
3. apache 接口---------org.apache.http.*


     Apache提供的HttpCient,实现起来简单方便:

A: GET方式操作

  1. public void get() {
  2.   String url = httpUrl + "?text1=" + text1.getText().toString()
  3.   + "&text2=" + text2.getText().toString();
  4.   // 创建HttpGet对象
  5.   HttpGet request = new HttpGet(url);
  6.   // 创建HttpClient对象
  7.   HttpClient client = new DefaultHttpClient();
  8.   HttpResponse httpResponse = null;
  9.   try {
  10.   httpResponse = client.execute(request);
  11.   if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  12.   text3.setText(EntityUtils.toString(httpResponse.getEntity(),
  13.   "utf-8"));
  14.   }
  15.   } catch (ClientProtocolException e) {
  16.   e.printStackTrace();
  17.   } catch (IOException e) {
  18.   e.printStackTrace();
  19.   }
  20.   }
  21.   public void get() {
  22.   String url = httpUrl + "?text1=" + text1.getText().toString()
  23.   + "&text2=" + text2.getText().toString();
  24.   // 创建HttpGet对象
  25.   HttpGet request = new HttpGet(url);
  26.   // 创建HttpClient对象
  27.   HttpClient client = new DefaultHttpClient();
  28.   HttpResponse httpResponse = null;
  29.   try {
  30.   httpResponse = client.execute(request);
  31.   if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  32.   text3.setText(EntityUtils.toString(httpResponse.getEntity(),
  33.   "utf-8"));
  34.   }
  35.   } catch (ClientProtocolException e) {
  36.   e.printStackTrace();
  37.   } catch (IOException e) {
  38.   e.printStackTrace();
  39.  }
  40.   }

B:POST方式操作

  1. public void post() {

  2.   // 创建HttpPost对象

  3.   HttpPost httpRequest = new HttpPost(httpUrl);

  4.   // 创建传递参数集合

  5.   List params = new ArrayList();

  6.   params.add(new BasicNameValuePair("text1", text1.getText().toString()));

  7.   params.add(new BasicNameValuePair("text2", text2.getText().toString()));

  8.   // 设置字符集

  9.   try {

  10.   HttpEntity entity = new UrlEncodedFormEntity(params, "utf-8");

  11.   httpRequest.setEntity(entity);

  12.   // 创建连接对象

  13.   HttpClient client = new DefaultHttpClient();

  14.   // 执行连接

  15.   HttpResponse response = client.execute(httpRequest);

  16.   if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

  17.   text3.setText(EntityUtils.toString(response.getEntity(),

  18.   "utf-8"));

  19.   }

  20.   } catch (UnsupportedEncodingException e) {

  21.   // TODO Auto-generated catch block

  22.   e.printStackTrace();

  23.   } catch (ClientProtocolException e) {

  24.   // TODO Auto-generated catch block

  25.   e.printStackTrace();

  26.   } catch (IOException e) {

  27.   // TODO Auto-generated catch block

  28.   e.printStackTrace();

  29.   }

  30.   }

  31.   public void post() {

  32.   // 创建HttpPost对象

  33.   HttpPost httpRequest = new HttpPost(httpUrl);

  34.   // 创建传递参数集合

  35.   List params = new ArrayList();

  36.   params.add(new BasicNameValuePair("text1", text1.getText().toString()));

  37.   params.add(new BasicNameValuePair("text2", text2.getText().toString()));

  38.   // 设置字符集

  39.   try {

  40.   HttpEntity entity = new UrlEncodedFormEntity(params, "utf-8");

  41.   httpRequest.setEntity(entity);

  42.   // 创建连接对象

  43.   HttpClient client = new DefaultHttpClient();
  44. // 执行连接
  45.   HttpResponse response = client.execute(httpRequest);
  46.   if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  47.   text3.setText(EntityUtils.toString(response.getEntity(),
  48.   "utf-8"));
  49.   }
  50.   } catch (UnsupportedEncodingException e) {
  51.   // TODO Auto-generated catch block
  52.   e.printStackTrace();
  53.   } catch (ClientProtocolException e) {
  54.   // TODO Auto-generated catch block
  55.   e.printStackTrace();
  56.   } catch (IOException e) {
  57.   // TODO Auto-generated catch block
  58.   e.printStackTrace();
  59.   }
  60.   }

你可能感兴趣的:(网络协议)