android 网络接口和HTTP通信

Android平台有3种网络接口可以使用,它们分别是: java.net.*(标准Java接口)、org.apache(Apache接口)和android.net.*(Android网络接口)。

 

1.标准java接口

java.net.*提供与联网有关的类,包括流和数据包套接字、Internet协议、常见HTTP处理。下面是例子:

        try {
            //定义地址
            URL url = new URL("http://www.google.com");
            //打开连接
            HttpsURLConnection http = (HttpsURLConnection) url.openConnection();
            //得到连接状态
            int nRC = http.getResponseCode();
            if(nRC == HttpsURLConnection.HTTP_OK){
                //取得数据
                InputStream is = http.getInputStream();
                //处理数据
                //...
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

2.Apache接口

  Apache HttpClient

        try {
            //创建HttpClient
            //这是使用DefaultHttpClient表示默认属性
            HttpClient hc = new DefaultHttpClient();
            //HttpGet实例
            HttpGet get = new HttpGet("http://www.google.com");
            HttpResponse rp = hc.execute(get);
            if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                InputStream is = rp.getEntity().getContent();
                //处理数据
            }
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

3.Android网络接口

  android.net.*包实际上是通过对apache中HttpClient的封装来实现的一个HTTP编程接口,同时还提供了HTTP请求队列管理以及HTTP连接池管理,以提高并发请求情况下和处理效率,除此之外还有网络状态监视等接口、网络访问的Socket、常用的Uri以及有关wifi相关的类

        try {
            InetAddress inetAddress = InetAddress.getByName("192.168.1.10");
            Socket client = new Socket(inetAddress, 6000, true);
            InputStream in = client.getInputStream();
            OutputStream out = client.getOutputStream();
            out.close();
            in.close();
            client.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (Exception e) {
            // TODO: handle exception
        }

 

 

Http通信

  Android提供了HttpURLConnection和HttpClient接口来开发HTTP程序。

1.HttpURLConnection接口

  get,  post.  get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给服务器。post和get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求数据是。

        URL url;
        try {
            //定义地址
            url = new URL("http://www.google.com");
            //打开连接
            HttpsURLConnection http = (HttpsURLConnection) url.openConnection();
            //设置输入输出流
            http.setDoOutput(true);
            http.setDoInput(true);
            //设置方式为post
            http.setRequestMethod("POST");
            //post请求不能使用缓存
            http.setUseCaches(false);
            
            InputStreamReader in = new InputStreamReader(http.getInputStream());
            BufferedReader buffer = new BufferedReader(in);
            String inputline = null;
            String resultData = null;
            while((inputline = buffer.readLine()) != null){
                resultData += inputline + "\n";
            }
            //关闭连接
            http.disconnect();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }    

2.HttpClient接口

  ClientConnectionManager接口

  DefaultHttpClient

  HttpResponse

  2.1  get方法

                try {  
                    //得到HttpClient对象  
                    HttpClient getClient = new DefaultHttpClient();  
                    //得到HttpGet对象  
                    HttpGet request = new HttpGet("http://www.google.com");  
                    //客户端使用GET方式执行请教,获得服务器端的回应response  
                    HttpResponse response = getClient.execute(request);  
                    //判断请求是否成功    
                    if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){  
                        //获得输入流  
                        InputStream  inStrem = response.getEntity().getContent();  
                        int result = inStrem.read();  
                        while (result != -1){  
                            System.out.print((char)result);  
                            result = inStrem.read();  
                        }  
                        //关闭输入流  
                        inStrem.close();      
                    }else {  

                    }             
                } catch (Exception e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  

 使用HTTP GET调用有一个缺点就是,请求的参数作为URL一部分来传递,以这种方式传递的时候,URL的长度应该在2048个字符之内。如果超出这个这范围,就要使用到HTTP POST调用。

 2.2  POST 方法

  使用POST调用进行参数传递时,需要使用NameValuePair来保存要传递的参数。NameValuePair封装了一个键/值组合。另外,还需要设置所使用的字符集。

        BufferedReader in = null;  
        try {  
            HttpClient client = new DefaultHttpClient();  
            HttpPost request = new HttpPost("http://code.google.com/android/");  
            //使用NameValuePair来保存要传递的Post参数  
            List<NameValuePair> postParameters = new ArrayList<NameValuePair>();  
            //添加要传递的参数    
            postParameters.add(new BasicNameValuePair("id", "12345"));  
            postParameters.add(new BasicNameValuePair("username", "dave"));  
            //实例化UrlEncodedFormEntity对象  
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(  
                    postParameters);  
 
            //使用HttpPost对象来设置UrlEncodedFormEntity的Entity  
            request.setEntity(formEntity);  
            HttpResponse response = client.execute(request);  
            in = new BufferedReader(  
                    new InputStreamReader(  
                            response.getEntity().getContent()));  
 
            StringBuffer string = new StringBuffer("");  
            String lineStr = "";  
            while ((lineStr = in.readLine()) != null) {  
                string.append(lineStr + "\n");  
            }  
            in.close();  
 
            String resultStr = string.toString();  
            System.out.println(resultStr);  
        } catch(Exception e) {  
            // Do something about exceptions  
        } finally {  
            if (in != null) {  
                try {  
                    in.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  

 

posted @ 2014-05-04 15:39  冰雨的日子  阅读(804)  评论(0编辑  收藏  举报