关于Android的网络编程的知识的总结

一、网络的基本概念

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值