2--安卓网络编程之http协议简介+小案例引入

零、前言

1.初衷

安卓一大堆网络框架,会用倒是会用,但总觉得封装得太多,就太表象了,这让我看不清网络的内在。 就像买了一份拼图,买来就是拼好的,我还不知道碎片是什么样子的,这样放着不管就可以了吗?真的不想自己拼一拼? 为了更清晰的认识网络,打算从起点来看一下安卓的安卓网络编程

2.本文测试的url为已在服务器上,可访问:

访问返回Json地址:http://www.toly1994.com:8089/swords/find/21 访问返回图片地址:http://www.toly1994.com:8080/imgs/logo/BroadcastReceiver.jpg 具体url的创建方法可详见:SpringBoot篇:SpringBoot-07-之数据库JPA(CRUD)


一、HTTP----超文本传输协议(HyperText Transfer Protocol)

1.HTTP一种基于TCP/IP协议的网络传输协议。 2.HTTP用于服务端传输超文本到客户端,是一种应用层的传输协议。

HTTP协议工作于客户端/服务端架构(B/S架构)上: 客户端通过URL(统一资源定位符)WEB服务器发送请求,WEB服务器根据请求,向客户端发送响应信息

WEB服务器:Apache服务器,IIS服务器、Tomcat、Nginx、Jetty等 客户端:浏览器、联网的App、游戏客户端等

1.http请求测试:

http请求.png

请求头:浏览器发送给服务器
#请求行:使用HTTP/1.1协议发送GET方式请求,访问域名下的/swords/find/21资源
GET /swords/find/21 HTTP/1.1
#请求的域名和端口
Host: localhost:8080
#维持长连接
Connection: keep-alive
Pragma: no-cache
#浏览器缓存类型
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
#浏览器的厂商信息
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/69.0.3497.100 Safari/537.36
#浏览器可接收的数据类型:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
#声明浏览器支持的编码类型
Accept-Encoding: gzip, deflate, br
#声明浏览器支持的语言
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
2.响应头:服务器发送给浏览器
#返回内容类型
Content-Type: application/json;charset=UTF-8
#时间
Date: Mon, 15 Oct 2018 00:26:33 GMT
#分块编码
Transfer-Encoding: chunked
3.响应体
{"id":21,
"name":"Excalibur",
"info":"Excalibur是传说中不列颠国王亚瑟王从湖之仙女那得到的圣剑。
此剑在是精灵在阿瓦隆(Avalon)所打造,剑锷由黄金所铸、剑柄上镶有宝石,并因其锋刃削铁如泥",
"imgurl":"http://localhost:8080/imgs/timg.jpg",
"create_time":"2018-07-17T08:29:36.000+0000",
"modify_time":"2018-07-17T08:29:36.000+0000",
"origin":"亚瑟王"}

http请求测试.png


二、请求网络并接收服务器返回的数据

添加网络访问权限
<uses-permission android:name="android.permission.INTERNET"/>
使用安卓原生网络API请求网络大致步骤:

1.创建URL对象url:new URL(String path) 2.使用url连接并获取HttpURLConnection对象conn:url.openConnection() 3.为conn对象设置请求信息:conn.setXXX() 4.校验响应码,200代表请求成功:conn.getResponseCode() 5.通过conn获取服务器传来的输入流:conn.getInputStream() 6.对流进行操作:java的基础----IO流

1.点击按钮是执行代码:

注意需要新开线程执行请求网络,不然异常:android.os.NetworkOnMainThreadException

String path = "http://192.168.43.60:8080/swords/find/21";
//新开线程访问网络
new Thread(() -> {
    String result = getRes(path);
    Log.e(TAG, "onViewClicked: " + result);
}).start();
2.请求网络核心代码:
/**
 * 通过url访问服务器,并接收服务器响应数据
 *
 * @param path url
 */
private String getRes(String path) {
    InputStream is = null;
    try {
        //1.创建URL对象url
        URL url = new URL(path);
        //2.使用url连接并获取HttpURLConnection对象conn
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //3.为conn对象设置请求信息
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);
        //4.校验响应码,200代表请求成功
        if (conn.getResponseCode() == 200) {
            //5.通过conn获取服务器传来的输入流
            is = conn.getInputStream();
            //6.对流进行操作
            StringBuilder sb = new StringBuilder();
            int len = 0;
            byte[] buf = new byte[1024];
            while ((len = is.read(buf)) != -1) {
                sb.append(new String(buf, 0, len));
            }
            return sb.toString();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (is != null) {
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return "error";
}

安卓请求网络.png

3.引申:可以通过输入网址来获取不同的返回值,并用TextView显示,如:

引申.png

你也可以请求一下百度的服务器,可以看出是返回了一个Html的源码,浏览器便是解析这份源码,渲染成视图展现出来的。

请求百度首页.png

三、请求网络,加载图片

可见请求一个url时,服务器会返回一个字节流,图片也是二进制,当然也能顺着服务器过来。 按照上面的实例,看看流过来的是什么?图片地址:http://www.toly1994.com:8080/imgs/logo/BroadcastReceiver.jpg

不出所料,是乱码,但能读出来就成功了一半

网络图片文字显示.png

显示图片

核心在于流的使用:通过流创建Bitmap对象:BitmapFactory.decodeStream(InputStream is)

1.点击按钮是执行代码:
new Thread(() -> {
    Bitmap img = decodeImg(mIdEtUrl.getText().toString());
    runOnUiThread(() -> {
        mIdIvImg.setImageBitmap(img);
        });
    }).start();
2.请求网络核心代码:
/**
 * 通过url返回一个Bitmap
 * @param path url
 * @return 图片
 */
private Bitmap decodeImg(String path) {
    InputStream is = null;
    OutputStream os = null;
    try {
        //1.创建URL对象url
        URL url = new URL(path);
        //2.使用url连接并获取HttpURLConnection对象conn
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //3.为conn对象设置请求信息
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);
        //4.校验响应码,200代表请求成功
        if (conn.getResponseCode() == 200) {
            //5.通过conn获取服务器传来的输入流
            is = conn.getInputStream();
            //6.对流进行操作
            return BitmapFactory.decodeStream(is);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (is != null) {
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return null;
}

网络图片.png


后记:捷文规范

1.本文成长记录及勘误表

项目源码

日期

备注

V0.1--无

2018-10-15

2--安卓网络编程之http协议简介+小案例引入

2.更多关于我

笔名

QQ

微信

爱好

张风捷特烈

1981462002

zdl1994328

语言

我的github

我的简书

我的CSDN

个人网站

3.声明

1----本文由张风捷特烈原创,转载请注明 2----欢迎广大编程爱好者共同交流 3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正 4----看到这里,我在此感谢你的喜欢与支持

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SDNLAB

OpenDaylight Hydrogen版本应用SampleTap研究(一)

最近在网上看到了一个以OpenDaylight为基础的SDN应用,所以下载下来研究了一番,简单的对其相关功能进行了研究,由于精力有限,只完成了代码编译和Open...

3905
来自专栏张善友的专栏

[腾讯社区开放平台]介绍开放授权协议-OAuth

OAuth (开放授权) 是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所...

2667
来自专栏程序员宝库

喂,快给我打一个小程序预览码

开发小程序的朋友们随时都会听到一句话:“喂,快给我打一个xxx环境的预览码”,无论你正在干什么,都得赶紧地回一句:“稍等,这就给你打码……”

1024
来自专栏Android开发指南

8.Smack类库

3357
来自专栏【转载】DRF+Vue+Mysql_生鲜超市系统

十三、首页、商品数量、缓存和限速功能开发

实现这个接口只要在goods/filters/GoodsFilter里面添加一个过滤就可以了

1510
来自专栏深度学习计算机视觉

Qt+opencv+EasyPR(车牌识别系统,从配置环境到成功运行)

最近在东软睿道实训搞一个车牌识别系统,所用材料为Qt+opencv+EasyPR,从配环境到成功运行历时几天颇为艰难,这里写篇经验贴,手把手教你~ 作者:张俊怡...

6713
来自专栏java思维导图

Java中高级面试题部分答案解析(4)

这里选了几道高频面试题以及一些解答。不一定全部正确,有一些是没有固定答案的,如果发现有错误的欢迎纠正,如果有更好的回答,热烈欢迎留言探讨。

1333
来自专栏安富莱嵌入式技术分享

【安富莱】【RL-TCPnet网络教程】第10章 RL-TCPnet网络协议栈移植(FreeRTOS)

本章教程为大家讲解RL-TCPnet网络协议栈的FreeRTOS操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文件、配...

1112
来自专栏程序员叨叨叨

compileSdkVersion 'android-24' requires JDK 1.8 or later to compile

今天,好久没有写Android程序的我突发奇想,想简单写一个每日任务APP。好的!新建工程->写好代码框架->开启模拟器->运行!哎哎哎?!那啥!咋报错了嘞?!...

1234
来自专栏魏艾斯博客www.vpsss.net

解决 Winscp 不显示隐藏文件的办法

平时魏艾斯博客使用 Winscp 当做 SFTP 工具, 我们也经常遇到要修改.htaccess 和.user.ini 等等用.开头或者其他特殊扩展名文件,在 ...

4579

扫码关注云+社区

领取腾讯云代金券