一、网络的基本概念
1、IP地址基本概念
IP地址在网络层将不同的物理网络地址统一到了全球唯一的IP地址上(屏蔽物理网络差异),是唯一标识互联网上计算机的逻辑地址(相当于手机号码,可以通过唯一的手机号码找到手机),所以IP地址也被称为互联网地址(可见其重要性)。
2、IP地址格式
我们目前常用的IPv4中规定,IP地址长度为32位二进制,在表示时,一般将32位地址拆分为4个8位二进制,再转为4个十进制数表示,每个数字之间用点隔开,如127.0.0.1(localhost),这种描述方式被称为“点-数表示法”。
IP地址层次:分为网络号和主机号两个层次。网络号表示主机所属网络,主机号表示主机本身。网络号与主机号的位数与IP地址分类有关。
3、IP地址分配
IP地址分配的基本原则是:要为同一网络(子网、网段)内不同主机分配相同的网络号,不同的主机号。
二、Http的网络应用设置
(一).HTTP请求
http请求由三部分组成,分别是:请求行、消息报头、请求正文。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。
1.格式如下: Method Request-URI HTTP-Version CRLF
1)Method表示请求方法;
2)Request-URI是一个统一资源标识符;
3)HTTP-Version表示请求 的HTTP协议版本;
4)CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或 LF字符)。
2.请求方法(所有方法全为大写)有多种,各个方法的解释如下:
1)GET 请求获取Request-URI所标识的资源
2)POST 在Request-URI所标识的资源后附加新的数据
3)HEAD 请求获取由Request-URI所标识的资源的响应消息报头
4)DELETE 请求服务器删除Request-URI所标识的资源
5)TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
6)CONNECT 保留将来使用 OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
3.应用举例:
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF)
POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。
HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含 的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可 以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访 问,以及最近是否更新。
(二)HTTP响应
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。
1.状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
1)HTTP-Version表示服务器HTTP协议的版本;
2)Status-Code表示服务器发回的响应状态代码;
3)Reason-Phrase表示状态代码的文本描述。 状态代码有三位数字组成,第
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起 使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
(三)Java请求方式
Android网络数据请求实现其实还是java的方式实现的,只不过要经过Android数据的处理才能显示再Android设备上。
Java通过URLConnection链接目的地网址,链接成功后从inputStream中获取返回内容。 HTTP请求常用的分为两种,一种是GET请求,一种是POST请求。
使用Java发送这两种请求的代码大同小异,只是一些参数设置的不同。
通过统一资源定位器 (java.net.URL) 获取连接器 (java.net.URLConnection)
三、URL
- 统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法。它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址。现在它已经被万维网联盟编制为互联网标准RFC1738。
- 互联网的文件都有一个唯一的URL
- 连接步骤如下:
(1)URL url = new URL(urltext); //获取网址的URL对象
(2)URLConnection conn = url.openConnection();//取得一个新的链接对指定的 URL的连接对象
(3)conn.connect();//连接网络;本方法不会自动重连 - HttpURLConnection是Java API的标准接口,包含在Java.net包中, 继承自URLConnection
- URLConnect ion与HttpURLConnect ion都是抽象类,无法直接实例化,通过URL的openConnection方法获得对象
- URL url = new URL( “https://www.baidu.com”);
- HttpURLConnection connection = ( Ht tpURLConnection) url. openConnection( );
- HttpURLConnection获取输入、输出流的方法
- InputStream getInputStream( ):获得输入流,调用此方法后才真正发生连接
- outputStream getoutputStream( ): 获得输出流
android常用的网络框架
1.Volley
Volley 的中文翻译为“齐射、并发”,是在 2013 年的 Google 大会上发布的一款 Android 平台网络通信库,具有网络请求的处理、小图片的异步加载和缓存等功能,能够帮助 Android APP 更方便地执行网络操作,而且更快速高效。
优点:
(1)自动调度网络请求;
(2)高并发网络连接;
(3)通过标准的 HTTP cache coherence(高速缓存一致性)缓存磁盘和内存透明的响应;
(4)支持指定请求的优先级( 请求队列的优先级排序);
(5) 提供多样的取消机制:网络请求 cancel 机制,我们可以取消单个请求,或者指定取消请求队列中的一个区域;
(6)框架容易被定制,例如,定制重试或者回退功能;
(7)包含了调试与追踪工具;
(8)默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下使用基于 HttpClient
(9)提供简便的图片加载工具(其实图片的加载才是我们最为看重的功能)
缺点:
(1)不能下载文件:这也是它最致命的地方
官网或相关地址:
Volley 的 github 地址:https://github.com/mcxiaoke/android-volley;
Google I/O 2013 – Volley: Easy, Fast Networking for Android:https://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded
2.OKHttp
OkHttp 是一个相对成熟的解决方案,据说 Android4.4 的源码中可以看到 HttpURLConnection 已经替换成 OkHttp 实现了。在 Android 6.0 中底层的源码已经使用了 OKHttp ,这个是可以确定的。
OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个 IP 连接失败的时候,OkHttp 会自动尝试下一个 IP。OkHttp 还处理了代理服务器问题和 SSL握手失败问题。
使用 OkHttp 无需重写您程序中的网络代码。OkHttp 实现了几乎和Java.NET.HttpURLConnection 一样的API。如果你用了 Apache HttpClient,则 OkHttp 也提供了一个对应的 okhttp-apache 模块。
官网或相关地址:
OKHttp 的 github 地址:https://github.com/square/okhttp
Get请求实例
String url = "https://www.baidu.com";
OkHttpClient okHttpClient = new OkHttpClient();//创建OkHttpClient实例
final Request request = new Request.Builder()
.url(url)
.get()//默认就是GET请求,可以不写
.build();//创建Request对象
Call call = okHttpClient.newCall(request);//将request对象封装成Call任务对象
call.enqueue(new Callback() {//执行异步任务,call.excute为同步任务
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.body().string());
}
});
post实例
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
String requestBody = "I am Jdqm.";
Request request = new Request.Builder()
.url("https://api.github.com/markdown/raw")
.post(RequestBody.create(mediaType, requestBody))
.build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, response.protocol() + " " +response.code() + " " + response.message());
Headers headers = response.headers();
for (int i = 0; i < headers.size(); i++) {
Log.d(TAG, headers.name(i) + ":" + headers.value(i));
}
Log.d(TAG, "onResponse: " + response.body().string());
}
});
Okhttp初始化
public OkHttpClient() {
this(new Builder());
}
public Builder() {
dispatcher = new Dispatcher(); // 由call代表的请求任务分发器
protocols = DEFAULT_PROTOCOLS; // 默认的协议 http2 http1.1
connectionSpecs = DEFAULT_CONNECTION_SPECS; // 设置连接时支持的tls层协议以及不进行数据加密
eventListenerFactory = EventListener.factory(EventListener.NONE);
proxySelector = ProxySelector.getDefault();
cookieJar = CookieJar.NO_COOKIES;
socketFactory = SocketFactory.getDefault(); // socket生产工厂
hostnameVerifier = OkHostnameVerifier.INSTANCE;
certificatePinner = CertificatePinner.DEFAULT;
proxyAuthenticator = Authenticator.NONE;
authenticator = Authenticator.NONE;
connectionPool = new ConnectionPool(); //连接池 支持多路复用
dns = Dns.SYSTEM;
followSslRedirects = true;
followRedirects = true;
retryOnConnectionFailure = true;
connectTimeout = 10_000;
readTimeout = 10_000;
writeTimeout = 10_000;
pingInterval = 0;
}