android网络应用开发完全解析

来源:互联网 发布:艾克里里变声软件 编辑:程序博客网 时间:2024/04/30 05:31

  Android网络应用开发,主要有两种方式,一种是socket(是对tcp/udp协议的封装),另外一种就是使用Http协议,Android中主要提供了两种方式,HttpURLConnection和Apache HttpClient。下面对Android网络应用开发进行具体的阐述。

一、基于socket的网络通信

socket是为了网络服务提供的一种机制。通信的两端都是socket。

网络通信其实就是socket间的通信。

数据在两个socket间进行io传输。

1、基于udp的socket编程步骤

  1. 定义码头
    即:定义一个DatagramSocket对象ds

  2. 定义可以用来接收或者发送数据的集装箱
    即:定义DatagramPacket对象dp

  3. 在码头上用集装箱接受对象发送过来的数据(ds.receive(dp))

  4. 关闭码头(ds.close())

2、基于tcp的socket编程步骤

这里写图片描述

二、基于http协议的网络通信

1、HttpURLConnection

  JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能:HttpURLConnection。HttpURLConnection是java的标准类,HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求。

下面是一个使用HttpURLConnection类的get请求访问网络的工具类:

/**     * getInputStream函数是为了获取读取服务器端资源的字节输入流     * @param path是url字符串     * @return InputStream     */    public static InputStream getInputStream(String path) {        URL url = null;        try {            url = new URL(path);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            // 设置请求方式            conn.setRequestMethod("GET");            // 设置连接的超时时间            conn.setConnectTimeout(5000);            // 设置可以从服务器端读取数据            conn.setDoInput(true);            // 获取服务器端的响应码            if (conn.getResponseCode() == 200) {                // 获得读取服务器端资源的字节输入流                InputStream in = conn.getInputStream();                return in;            }        } catch (MalformedURLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }

2、Apache HttpClient

  HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

  httpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。

下面是使用httpClient get方式访问网络的工具类:

    /**     * 读取输入流,返回数据     * @param stream     * @return     */    public static byte[] readStream(InputStream stream) throws IOException{        byte[] ret = null;        ByteArrayOutputStream bout = new ByteArrayOutputStream();        byte[] buf = new byte[128];        int len;        while (true) {            len = stream.read(buf);            if (len == -1) {                break;            }            bout.write(buf, 0, len);        }        //强制释放临时的资源        buf = null;        ret = bout.toByteArray();        bout.close();        return ret;    }    /**     * get请求方法     * @param url 网址     * @return     */    public static byte[] doGet(String url) {        byte[] ret = null;        HttpGet request = new HttpGet(url);        HttpClient client = new DefaultHttpClient();        try {            HttpResponse response = client.execute(request);            StatusLine statusLine = response.getStatusLine();            int statusCode = statusLine.getStatusCode();            if (statusCode == 200) {                HttpEntity entity = response.getEntity();                InputStream stream = entity.getContent();                //返回的实际数据                ret = readStream(stream);                stream.close();            }        } catch (IOException e) {            e.printStackTrace();        }        return ret;    }

3、HttpURLConnection与HttpClient的区别

  在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。对于新的应用程序应该更加偏向于使用HttpURLConnection。

具体参考:Android访问网络,使用HttpURLConnection还是HttpClient?http://blog.csdn.net/guolin_blog/article/details/12452307

4、关于get、post请求方式区别

  Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

  get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet 。

  post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。

这里写图片描述

这里写图片描述

三、socket通信和http通信区别

  httpConnection封装了socket而已,实质上还是用的socket。HttpURLConnection主要还是用来和web服务器之间进行通信的。如果只是普通的客户端和服务器的数据传递,用socket就好了。HTTPURLConnection是对Socket的封装。也就是说HTTPURLConnection就是Socket.都是用来建立一个数据传输的通道。通道有了,数据怎么传就看需要了。HttpURLConnection只是在socket的基础上对http协议进行了支持。

  由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。

  而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

  很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

  Socket通讯方式和Http方式各有优缺点,很难说哪个好些。但一般来说,使用Http链接已经可以了。除非是那种即时性较强的应用,使用Http即可。

0 0
原创粉丝点击