【Android】HTTPConnection与HttpClient(待续)

目录

1. 概述

2. HTTP协议

(1)在TCP/IP协议栈中的位置

(2)HTTP的请求响应

(3)工作流程

(4)请求包示例:

(5)应答包示例:

3. 检查网络连接状态

(1)判断是否有网络连接

(2) 检查是否是 wifi网络是否可用

(3) 检查当前网络连接的类型信息

4. 显示网络图片

图片加载方法

(1)runOnUiThread方法

(2)view.post 方法


1. 概述

 如今,移动端APP渗透到各行各业,数量难以计数,几乎所有应用都会使用到网络,掌握Android网络编程是APP开发是核心技术,必备技术。这是因为移动设备的计算能力、存储能力都是有限的。因此移动设备依赖网络计算、存储就成为了主要的方式,重要程度就不言而喻了。

Android完全支持JDK本身的TCP、UDP网络通信的APl,也就是我们在JAVASE阶段讲解的网络编程,也叫Socket编程,Android也支持基于HTTP协议的URLConnection,并内置Apache HttpClient APl来简化HTTP的操作。
本课程我们将介绍当前最常用的网络编程枝术,包括:URLConnection、Apache HttpClient、WebService、Volley(Google官方推荐框架/组件)、android-async-http、WebView。

2. HTTP协议

HTTP是Hyper Text Transfer Protocol(超文本传输协议),它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC2616定义了今天普遍使用的一个版本—HTTP1.1。

(1)在TCP/IP协议栈中的位置

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
如下图所示:默认HTTP的端口号为80,HTTPS的端口号为443。

【Android】HTTPConnection与HttpClient(待续)_第1张图片

(2)HTTP的请求响应

【Android】HTTPConnection与HttpClient(待续)_第2张图片

这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。

(3)工作流程

一次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

(4)请求包示例:

HTTP请求包(GET?POST等请求方法)由三个部分构成,分别是:方法-URI-协议/版本,请求头,请求正文。下面是一个HTTP协议请求包(GET)的例子:
1、GET/index.jsp HTTP/1.1
2、Accept-Language:zh-cn
3、Connection:Keep-Alive
4、Host:192.168.0.106
5、Content-Length:37
6、userName=vince&password=123456

(5)应答包示例:

和HTTP请求包相似,由三个部分构成,分别是:协议-状态代码-描述,应答头,应答正文。下面是一个HTTP应答的例子:
1、HTTP/1.1200OK
2、Server:Microsoft-llS/4.03、Date:Mon,3 Jan 2005 13:13:33 GMT
4、Content-Type:text/html
5、Last-Modified:Mon,11 Jan 2004 13:23:42 GMT
6、Content-Length:90

7、解读HTTP包示例
            Hello WORLD!
     

3. 检查网络连接状态

添加权限:

(1)判断是否有网络连接

public boolean isNetworkConnected(Context context) {
    if (context != null) {
        ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
        if (mNetworkInfo != null) {
            return mNetworkInfo.isAvailable();
        }
     }
     return false;
}

(2) 检查是否是 wifi网络是否可用

public boolean isNetworkType(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager)
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (mNetworkInfo != null) {
                return mNetworkInfo.isAvailable();
            }
        }
        return false;
    }

(3) 检查当前网络连接的类型信息

public static int getConnectType(Context context) {
        if (context != null) {
            ConnectivityManager mConnectivityManager = (ConnectivityManager)
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
            if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
                return mNetworkInfo.getType();
            }
        }
        return -1;
    }

4. 显示网络图片

图片加载方法

public Bitmap getPicture(String path) {
        Bitmap bm = null;
        try {
            URL url = new URL(path);    //创建URL对象
            URLConnection conn = url.openConnection();    //获取URL对象对应的连接
            conn.connect();    //打开连接
            InputStream is = conn.getInputStream();    //获取输入流对象
            bm = BitmapFactory.decodeStream(is);    //根据输入流对象创建Bitmap对象
        } catch (MalformedURLException e1) {
            e1.printStackTrace();    //输出异常信息
        } catch (IOException e) {
            e.printStackTrace();    //输出异常信息
        }
        return bm;
    }

(1)runOnUiThread方法

btmRunOnUiThread.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        final Bitmap btm = getPicture("https://img3.doubanio.com/view/subject/l/public/s27308766.jpg");
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                imageView.setImageBitmap(btm);
                            }
                        });
                    }
                }).start();
            }
        });

(2)view.post 方法

btmViewPost.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        final Bitmap btm=getPicture("https://img3.doubanio.com/view/subject/l/public/s27308766.jpg");
                        imageView.post(new Runnable() {
                            @Override
                            public void run() {
                                imageView.setImageBitmap(btm);
                            }
                        });
                    }
                }).start();
            }
        });

 

你可能感兴趣的:(Android)