核心技术篇:1.移动应用的根源---网络

前言

  有一次面试时候,一位面试官曾说过,所谓移动应用,重点就在于设备与网络的连接,通过网络实现用户界面和服务器的数据交互。与有线互联网一样,无线互联网也可以使用HTTP访问网络,在android中,实现HTTP通信有两种方法:一种是通过HttpURLConnextion实现,另一种是通过HttpClient实现。

HttpURLConnection类

  使用HttpURLConnection进行通信又分为两种方法:get()和post()

  默认发送的是get()请求,发送get请求时候可以在url后面通过“?参数名=参数值”的方式进行传递,多个参数之间使用逗号隔开,如:

String target="http://192.168.1.104:8080/blog/index.jsp?content="+base64(contentText.getText().toString().trim());

  使用get方法进行数据通信主要通过以下代码实现:

url=new URL(target);//创建一个URL对象
            //由于HttpURLConnection是一个抽象类,因此可以通过openConnection实例化一个对象
            //使用HttpURLConnection,默认发送的就是get请求
            HttpURLConnection urlConn=(HttpURLConnection) url.openConnection();
            //以上为向服务器发送内容
            //以下为从服务器读取内容
            if (urlConn.getResponseCode()==HttpURLConnection.HTTP_OK){
                InputStreamReader in=new InputStreamReader(urlConn.getInputStream());//从服务器读取内容
                BufferedReader buffer=new BufferedReader(in);//获得输入流对象并转换为文本
                //通过循环逐行读取输入流内容
                String inputline=null;
                while((inputline=buffer.readLine())!=null){
                    result+=inputline+"\n";
                }
                in.close();//关闭字符输入流对象
            }
            urlConn.disconnect();//断开连接

  需要说明的是,url.openConnection()只是建立了一个Http连接;直到urlConn.getInputStream()才真正把http请求发送出去。

  使用Post()方法主要通过以下代码实现:

url=new URL(target);//创建一个URL对象
            //由于HttpURLConnection是一个抽象类,因此可以通过openConnection实例化一个对象
            HttpURLConnection urlConn=(HttpURLConnection) url.openConnection();
            urlConn.setRequestMethod("POST");//指定使用POST方式进行请求
            urlConn.setDoInput(true);//允许向连接写入数据
            urlConn.setDoOutput(true);//允许从连接读取数据
            urlConn.setUseCaches(false);//禁止缓存,post请求不能使用缓存
            urlConn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");//设置内容类型为URI
            DataOutputStream out=new DataOutputStream(urlConn.getOutputStream());//获取输出流
            String param="content"+URLEncoder.encode(contentText.getText().toString(),"utf-8");
            out.writeBytes(param);//往数据输出流写入数据
            out.flush();//刷新输出流,输出缓存
            out.close();//关闭输出流
            //以上为向服务器发送内容
            //以下为从服务器读取内容
            if (urlConn.getResponseCode()==HttpURLConnection.HTTP_OK){
                InputStreamReader in=new InputStreamReader(urlConn.getInputStream());//从服务器读取内容
                BufferedReader buffer=new BufferedReader(in);//获得输入流对象并转换为文本
                //通过循环逐行读取输入流内容
                String inputline=null;
                while((inputline=buffer.readLine())!=null){
                    result+=inputline+"\n";
                }
                in.close();//关闭字符输入流对象
            }
            urlConn.disconnect();//断开连接

  post方式中,http正文是通过outputstream方式写入的,outputstream实际上是个字符串流,往里面写入的数据并不会马上发送到网络,而是存储在内存缓冲区,待outputstream关闭后,根据输入的内容生成正文。参数传递方式的不同也正是get()方法和post()方法之间最大的区别。

  无论是采用get()方法或者post()方法,都需要开启一个新的子线程进行网络数据传输,并通过Handler进行消息的发送和处理:

//创建一个新线程,用于发送和读取信息
                new Thread(new Runnable(){
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        URLGetSend();//发送文本内容到服务器并从服务器读取结果
                        //利用obtainMessage从消息池中获取空消息对象
                        Message m=handler.obtainMessage();
                        handler.sendMessage(m);
                    }
                }).start();
handler=new Handler(){
            @Override
            public void handleMessage(Message msg){
                if(result!=null){
                    resultTV.setText(result);//更新UI线程中的界面
                    contentText.setText("");
                }
                super.handleMessage(msg);
            }
        };

  线程的创建与使用、Handler的使用、以及与Messagequeue之间的关系将会另开一篇文章进行介绍。

HttpClient类

  HttpURLConnection一般用于在某个简单页面提交请求并获取服务器的响应,对于更复杂的互联网操作,HttpClient能更好地实现。两种实现方法其实有很大联系,HttpClient对HttpURLConnection类中的输入输出流操作进行封装,封装为HttpGet、HttpPost和HttpRespense类,如此一来,减少了操作的繁琐性。其中,HttpGet类用于发送get请求,HttpPost类用于发送Post请求,HttPrespense类代表处理响应的对象。

  get()请求可以通过以下代码实现:

String target="http://192.168.1.104:8080/blog/index.jsp?content="+base64(contentText.getText().toString().trim());
        HttpClient httpclient=new DefaultHttpClient();//创建HttpClient对象
        HttpGet httpRequest=new HttpGet(target);//创建httpget连接对象
        HttpResponse httpResponse;
        try{
            httpResponse=httpclient.execute(httpRequest);//指定HttpClient请求
            if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
                result=EntityUtils.toString(httpResponse.getEntity());//对返回的数据进行转换
            }
            else{
                result="fail";
            }
        }

  相对HttpURLConnection类的get()方法操作方便很多。

  post()请求可以通过以下代码实现:

String target="http://192.168.1.104:8080/blog/index.jsp";
        HttpClient httpClient=new DefaultHttpClient();
        //直接使用HttpPost类实例化一个对象,不用指定请求方式
        HttpPost httpRequest=new HttpPost(target);//创建httppost连接对象
        HttpResponse httpResponse;
        //将要传递的参数保存到list集合中
        List<NameValuePair> params=new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("content",contentText.getText().toString() ));
        try{
            httpRequest.setEntity(new UrlEncodedFormEntity(params,"utf-8"));//设置编码方式
            httpResponse=httpClient.execute(httpRequest);//执行HttpClient请求
            if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
                result=EntityUtils.toString(httpResponse.getEntity());//对返回的数据进行转换
            }
            else{
                result="fail";
            }
        }

  post()方法中,可以通过setParams()方法来添加请求参数,也可以调用setEntity()实现。

后续:

  有关http相关的知识还有很多,后期再做深入的学习。

核心技术篇:1.移动应用的根源---网络,布布扣,bubuko.com

时间: 2024-08-12 01:57:49

核心技术篇:1.移动应用的根源---网络的相关文章

核心技术篇:6.android网络编程之json解析

前言:好一段时间没写博客了,说最近挺忙的,感觉像是个借口,每天还是同样的24个小时,每天还是同样的5:30就准时下班,每天晚上还是有大量的空余时间...最直接的原因就是,最近堕落了.脑子里也时常会有很多想法浮现,都是些比较实际的想法,但往往就是浮现那一下,心情激动了一下,心里默默告诉自己,有时间就要这么做...好多想法都被一些其它的诱惑给磨灭掉了,要么是打球.要么是看电影.要么是处理一些乱七八糟的事去了.总之,近段时间,花在技术上的时间很少很少,好好反思下. 前段时间,来了一位新疆的客户,提出了

Spring Boot 2.0深度实践之核心技术篇

第1章 系列总览总览 Spring Boot 2.0 深度实践系列课程的整体议程,包括 Spring Boot 三大核心特性(组件自动装配.嵌入式Web容?.生产准备特性).Web 应用(传统 Servlet.Spring Web MVC.Spring WebFlux).数据相关(JDBC.JPA.事务).功能扩展(SpringApplication.Spring Boot 配置.Spring Boot Starter)以及... 第2章 走向自动装配完整地讲述了 Spring Boot 是如何

深度实践Spring Boot 2.0之核心技术篇

第1章 系列总览总览 Spring Boot 2.0 深度实践系列课程的整体议程,包括 Spring Boot 三大核心特性(组件自动装配.嵌入式Web容器.生产准备特性).Web 应用(传统 Servlet.Spring Web MVC.Spring WebFlux).数据相关(JDBC.JPA.事务).功能扩展(SpringApplication.Spring Boot 配置.Spring Boot Starter)以及... 1-1 -课程导学1-2 为什么说Spring Boot 2.0

【计算机网络】1.3 网络核心的数据交换

第一章第三节 网络核心的数据交换 在学习了网络边缘之后,我们深入研究网络核心,本节对在网状网络中的数据交换进行介绍. Outline 数据交换 电路交换 多路复用技术 FDM TDM WDM CDM 分组交换 Notes ## 数据交换 若任意两个主机之间需要建立通信,最简单的想法就是在两个主机之间建立链路,若有n个主机,则需要O(n2)条链路,这在技术和经济上都是不可行的,故引入交换设备,实现主机之间的动态链接: 为了保证连通性,我们还可以将交换设备相连接构成交换网络 数据交换可以具体实现以下

Java学习之网络编程实例

转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码

基于redis AE异步网络架构

最近的研究已redis源代码,redis高效率是令人钦佩. 在我们的linux那个机器,cpu型号, Intel(R) Pentium(R) CPU G630 @ 2.70GHz Intel(R) Pentium(R) CPU G630 @ 2.70GHz 上 set,get 都能达到每秒钟15W的请求处理量,真是佩服这代码的效率. 前几篇文章.主要是介绍了主要的代码.比方字符串处理,链表处理.hash等. 这篇文章介绍网络的核心,基于事件反映的异步网络框架. 异步网络处理.是基于epoll的.

Java网络编程基础【转】

网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.

Linux内核--网络栈实现分析(一)--网络栈初始化

本文分析基于内核Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7488828 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 以后的系列博文将深入分析Linux内核的网络栈实现原理,这里看到曹桂平博士的分析后,也决定选择Linux内核1.2.13版本进行分析. 原因如下: 1.功能和网络栈层次

基于redis AE的异步网络框架

最近一直在研究redis的源码,redis的高效率令人佩服. 在我们的linux机器上,cpu型号为, Intel(R) Pentium(R) CPU G630 @ 2.70GHz Intel(R) Pentium(R) CPU G630 @ 2.70GHz 上 set,get 都能达到每秒钟15W的请求处理量,真是佩服这代码的效率. 前几篇文章,主要是介绍了基本的代码,比如字符串处理,链表处理,hash等.这篇文章介绍网络的核心,基于事件反映的异步网络框架. 异步网络处理,是基于epoll的.