Android网络编程基础(一) - 基础知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KevinDGK/article/details/52223493

内容介绍:Android网络编程基础
博客地址:http://blog.csdn.net/kevindgk
版权声明:本文为原创文章,未经允许不得转载
联系方式:[email protected]

前言

最近项目上用到了网络通信相关的很多技术,越做越发现自己之前接触的实在是太少了,要学的太多,所以尽量每周末总结一篇Android网络通信相关的博客,先从网络编程基础开始,包含基于TCP/IP或者UDP的Socket基础、HTTP编程,然后是一些网络模块编程,比如地图、Wifi、蓝牙、NFC等等,本类文章注重于技术的使用和实用,对底层代码不涉及太深入。在整个过程中,我会不断优化自己的编程框架和尝试更多的新技术,慢慢的让自己对框架理解的更加透彻,顺便完成自己的一个大的项目。对网络通信感兴趣的朋友,可以随时加我qq,一起学习~

推荐书籍

  • 《疯狂Java讲义》 第17章 网络编程
  • 《疯狂Android讲义》 第13章 Android网络应用
  • 《Android网络编程:技术详解与最佳实践》
  • 《深入理解Android:WiFi模块 NFC和GPS卷》
  • 百度百科:有问题百度一下~

基础知识

如果仅仅针对Android开发,不需要了解太多的计算机网络相关的知识,但是知道一些基本的东西,对我们深入学习Android网络编程有很大的帮助~小编表示,大学学的计算机网络已经还给了老师,强烈要求退学费( ̄▽ ̄)”

1.计算机网络概述

计算机网络就是用物理链路将各个孤立的工作站或主机连接在一起, 组成数据链路,从而达到资源共享和通信的目的。凡将地理位置不同且具有独立功能的多个计算机系统通过通信设备和线路连接起来, 并以功能完善的网络软件( 网络协议、 信息交换方式及网络操作系统等) 实现网络资源共享的系统, 均可称为计算机网络。 简单地说, 计算机网络即连接两台或多台计算机进行通信的系统。

2.OSI参考模型和TCP/IP模型

国际标准化组织( ISO) 在 1978 年提出了“开放系统互连参考模型”, 即著名的 OSI/RM 模型( Open System Interconnection/Reference Model)。 OSI 是标准化组织为了实现设备互联而提出的一个纯理论的框架性的概念。也可就是说:它只能告诉我们一个网络应该具备哪些功能,某个功能的实现是在某个层次,但具体的实现技术他是不进行规范的。因为OSI的网络模型标准比较严格,另外推出的时间也相对较晚,所以目前还没有完全按照OSI模型实现的网络。TCP/IP是另一种网络模型,也是我们实际应用最广泛的一种网络的模型。在这个模型中,不只是划分了功能层,还有具体的实现技术,即协议。TCP和IP就是这个模型中最重要的两个层次的代表协议。这两个模型之间的可以说是完全独立的。因为OSI是一种理论上的指导。而TCP/IP是一种事实上的标准。但两者也是有一定联系的,两者都是网络模型,都存在某些相同的层次。另外,OSI是一个通用性的指导,它不仅可以解释TCP/IP,还可以解释任何一种类型的网络。而TCP/IP是无法解释其他网络的。

这里写图片描述

我们重点关注一下TCP/IP模型中的传输层和网络层的协议即可:

这里写图片描述

  • TCP:传输控制协议,它规定了一种可靠的数据传输,经常和网络层的IP协议合并使用,统称为TCP/IP协议。

  • UDP:用户数据报协议,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

    简单对比

TCP UDP
可靠性 面向连接,可靠性好
效率 资源消耗较高,效率较低

3.IP地址和端口号

在网络编程中一定要掌握IP地址和端口号知识,IP地址用于唯一的标识网络中的一个通信实体,这个通信实体既可以是一台主机,也可以是一台打印机,或者是路由器的某一个端口。在基于IP协议网络中传输的数据包,都必须使用IP地址来进行标识。

IP地址的划分:

这里写图片描述

在这五类ip地址中,我们需要重点关注的是:

  • 私有IP地址:

    在现在的网络中,IP地址分为公网IP地址和私有IP地址。公网IP是在Internet使用的IP地址,而私有IP地址则是在局域网中使用的IP地址。也就是说私有IP地址只能在局域网中使用,比如你向主机位192.168.0.1这个主机发消息,发送不到公网去,局域网会主动在局域网内查找该主机。

类别 范围
A类IP地址中的私有地址 10.0.0.0到10.255.255.255
B类IP地址中的私有地址 172.16.0.0到172.31.255.255
C类IP地址中的私有地址 192.168.0.0到192.168.255.255

- 组播IP地址:就是D类IP地址。

范围 作用
224.0.0.0~224.0.0.255 预留的组播地址(永久组地址)
224.0.1.0~224.0.1.255 公用组播地址,可以用于Internet
224.0.2.0~238.255.255.255 用户可用的组播地址(临时组地址),全网范围内有效
239.0.0.0~239.255.255.255 本地管理组播地址,仅在特定的本地范围内有效

稍后,我们会重点学习一下单播、组播和多播的知识。

4.端口号

IP地址用于唯一的标识网络上的一个通信实体,但是一个通信实体可以有多个通信程序同时提供网络服务,此时需要使用端口号。端口是一个16位的整数,用于表示数据交给哪个通信程序处理,因此,端口就是应用程序与外界交流的出入口,它是一种抽象的软件结构,包括一些数据结构和I/O缓冲区。

不要的应用程序处理不同的端口号,同一台机器上不能有两个程序使用同一个端口,端口号分为:

范围 作用
公认端口 0~1023
注册端口 1024~49151
动态或私有端口 49152~65535

简单讲,IP地址就是你的家庭住址,具体到街道和门牌号,端口就相当于你的房间号码。当一个程序需要发送数据的时候,需要指定目的地的IP地址和端口号。

5.单播、组播、广播

简单区分一下:

  • 单播:一对一,发送者和接收者建立点对点网络连接,进行通信。

    ​ 优点:服务器及时响应客户端的请求,针对每个客户端实现不同的响应。

    ​ 缺点:在流媒体应用中因为数据流过大,服务器会不堪重负。

  • 广播:一对多,向某个网段发送信息,该网段内的所有主机都会收到信息。

    ​ 优点:网络设备简单,成本低,服务器流量负载低;

    ​ 缺点:无法针对每个客户端的要求实现不同的响应,并且容易造成信息泛滥,最关键的是禁止在公网传播,只能在局域网内使用。

  • 组播:一对组,发送端发送一次数据,加入同一个组播组的所有主机都可以接收到这份数据。

    简单讲,

    单播:就是单聊,一对一通信;

    广播:就是群发,你发送的消息所有人都会收到;

    组播:就是群聊,你发的消息在这个群里的所有人都会收到。

Android基本网络支持

1.获取网络基本信息

Java中,该类表示IP地址,并且还有两个子类Inet4Address和Inet6Address分别代表IPv4和IPv6地址。该类没有构造方法,通过以下两个静态方法来获取InetAddress实例:

  • getByName(String host):根据主机名获取对应的InetAddress对象;
  • getByAddress(byte[] addr):根据原始IP地址来获取对应的InteAddress对象;
  • getLocalHost():获取本机IP地址对应的InetAddress类;

还有如下三个方法来获取该实例对应的IP地址和主机名:

  • String getCanonicalHostName():获取此IP地址的全限定域名;
  • String getHostName():获取此IP地址的主机名;
  • String getHostAddress():返回该InetAddress实例对应的IP地址字符串;
  • isReachable():用于测试该IP地址是否可以达到;

代码:

这里写图片描述

打印结果:

这里写图片描述

结果分析:对于手机来讲,其实通过InetAddress获取的本机IP并没有什么卵用,都是127.0.0.1代表本机,如果是电脑的话会获取到电脑的局域网ip。所以,手机要通过WifiManage来获取WifiInfo,然后所有的信息都可以通过该类获取:

  • int getIpAddress():获取局域网分配的IP地址;

    IP地址是32位,返回的是int类型,四个字节,所以需要稍微解析一下,变成字符串表示的形式:

    /** 将Ip地址改成字符串表示格式 */
    public static String IntToIp(int i) {
    LogUtil.i("【CommonUtil】", "IntToIp");
    return (i & 0xFF) + "." +
      ((i >> 8) & 0xFF) + "." +
      ((i >> 16) & 0xFF) + "." +
      (i >> 24 & 0xFF);
    }
  • int getNetworkId():获取网络ID;

  • String getSSID():获取SSID;

2.Socket相关

数据包的长度是有限的,传输的时候需要将其分解为多个包, 在到达传输的目的地址后再组合还原。 如包有丢失或
者破坏需要重传时, 则乱序发送的包在达到时需要重新排序。 处理这些过程是一项繁杂的工作, 需要大量可靠的代码来完成。 为了使程序员不必费心于上述这些底层具体细节, 通过 Socket 对网络纠错、 包大小、 包重传等进行了封装。

Socket的英文原义是“孔”或“插座”,通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。客户软件将插头插到不同编号的插座,就可以得到不同的服务。

Socket通信模型:

这里写图片描述

3.TCP通信模型

这里写图片描述

4.UDP通信模型

这里写图片描述

后面会详细介绍Android通信编程中,这几种模型的开发,以及实战。

猜你喜欢

转载自blog.csdn.net/KevinDGK/article/details/52223493