zoukankan      html  css  js  c++  java
  • (转)android连网详解

    今天我们将深入介绍了Android SDK 中一些与网络有关的package,如下: 
    包描述

    java.net 提供与联网有关的类,包括流和数据包(datagram)sockets、Internet 协议和常见 HTTP 处理。该包是一个多功能网络资源。有经验的 Java 开发人员可以立即使用这个熟悉的包创建应用程序。
    java.io 虽然没有提供显式的联网功能,但是仍然非常重要。该包中的类由其他 Java 包中提供的 socket 和连接使用。它们还用于与本地文件(在与网络进行交互时会经常出现)的交互。
    java.nio 包含表示特定数据类型的缓冲区的类。适合用于两个基于 Java 语言的端点之间的通信。
    org.apache.* 表示许多为 HTTP 通信提供精确控制和功能的包。可以将 Apache 视为流行的开源 Web 服务器。
    android.net 除核心 java.net.* 类以外,包含额外的网络访问 socket。该包包括 URI 类,后者频繁用于 Android 应用程序开发,而不仅仅是传统的联网方面
    android.net.http 包含处理 SSL 证书的类。
    android.net.wifi 包含在 Android 平台上管理有关 WiFi(802.11 无线 Ethernet)所有方面的类。并不是所有设备都配备了 WiFi 功能,特别是 Android 在 Motorola 和 LG 等手机制造商的 “翻盖手机” 领域获得了成功。
    android.telephony.gsm 包含用于管理和发送 SMS(文本)消息的类。一段时间后,可能会引入额外的包来来为非 GSM 网络提供类似的功能,比如 CDMA 或 android.telephony.cdma 等网络。



    上表并没有列出所有包,但是可以让我们清楚地意识到Android的强大功能。 
    介绍一个简单的网络示例 

    在EditView中输入URL后,单击“go!”按钮,界面显示如下

     

     

    界面部分的代码简要明了,就不此额外说明了,下面详细解析核心代码,如下:

    Java代码 
    1. final  Button button = (Button) findViewById(R.id.ButtonGo);   
    2. button.setOnClickListener( new  Button.OnClickListener() {   
    3. public   void  onClick(View v) {   
    4. try {   
    5. tView.setText(”");   
    6. // 获取输入的URL地址   
    7. URL url =  new  URL(eText.getText().toString());   
    8. URLConnection conn = url.openConnection();   
    9. //获取网页数据流   
    10. BufferedReader rd =   
    11. new  BufferedReader( new  InputStreamReader(conn.getInputStream()));   
    12. String line = “”;   
    13. //读取数据   
    14. while  ((line = rd.readLine()) !=  null ) {   
    15. Message lmsg;   
    16. lmsg =  new  Message();   
    17. lmsg.obj = line;   
    18. lmsg.what =  0 ;   
    19. //将数据显示在界面上   
    20. h.sendMessage(lmsg);   
    21. }   
    22. }   
    23. catch  (Exception e)   
    24. {   
    25. //输出异常信息   
    26. Log.v(”Browse”, e.toString());   
    27. }   
    28. }   
    29. });  
    1. final Button button = (Button) findViewById(R.id.ButtonGo);  
    2. button.setOnClickListener(new Button.OnClickListener() {  
    3. public void onClick(View v) {  
    4. try{  
    5. tView.setText(”");  
    6. // 获取输入的URL地址  
    7. URL url = new URL(eText.getText().toString());  
    8. URLConnection conn = url.openConnection();  
    9. //获取网页数据流  
    10. BufferedReader rd =  
    11. new BufferedReader(new InputStreamReader(conn.getInputStream()));  
    12. String line = “”;  
    13. //读取数据  
    14. while ((line = rd.readLine()) != null) {  
    15. Message lmsg;  
    16. lmsg = new Message();  
    17. lmsg.obj = line;  
    18. lmsg.what = 0;  
    19. //将数据显示在界面上  
    20. h.sendMessage(lmsg);  
    21. }  
    22. }  
    23. catch (Exception e)  
    24. {  
    25. //输出异常信息  
    26. Log.v(”Browse”, e.toString());  
    27. }  
    28. }  
    29. });  



    简要解析如下:URL 和 URLConnection 类共同提供与用户所选的 Web 站点的连接。BufferedReader 的一个实例负责从 Web 站点连接中读取传入的数据。每读取一行代码,文本就被附加到一个 TextView。数据并没有直接指定给 TextView,而是引入了一种设计模式,即创建一个消息对象并将该对象发送到一个处理程序的实例。这是更新 UI 的一种比较可取的方法,对可能需要同时运行多个线程的应用程序而言尤其如此。 A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue,这句话简单明了,相信大家一看就完全明白了。 
    补充说明 

    以上程序,在实际运行中可能会导致异常,catch (Exception e) 输出异常信息: 
    java.net.SocketException: Permission denied(maybe missing INTERNET permission) 
    需要在AndroidManifest.xml中定义相应的权限,如下: 
    <uses-permission android:name=”android.permission.INTERNET” /> 
    注意在<application>也可以定义INTERNET权限,如下: 
    <application android:permission=”android.permission.INTERNET”> 
    这种权限似乎还是会导致异常,看来两种权限除了作用的范围有所不同,具体的作用也是有些不同的,以后开发中需要注意两者的区别。 


    2、org.apache.http联网实现 
    Android使用HttpClient完成Post和Get方式的联网请求 


    Android联网可以采用HttpPost,HttpGet封装post请求和get请求,再使用HttpClient的excute方法发送post或者get请求并返回服务器的响应数据。 

          1、设置连接和读取超时时间,并新建HttpClient对象: 

                // 设置连接超时时间和数据读取超时时间 
                HttpParams httpParams = new BasicHttpParams(); 
                HttpConnectionParams.setConnectionTimeout(httpParams, 
                        KeySource.CONNECTION_TIMEOUT_INT); 
                HttpConnectionParams.setSoTimeout(httpParams, 
                        KeySource.SO_TIMEOUT_INT); 
                //新建HttpClient对象 
                HttpClient httpClient = new DefaultHttpClient(httpParams) 

    2、Get请求: 

           // generate get request 
            HttpGet get = new HttpGet(url); 
            // set HTTP head parameters 
            //Map<String, String> headers 
            if (headers != null) 
            { 
                Set<String> setHead = headers.keySet(); 
                Iterator<String> iteratorHead = setHead.iterator(); 
                while (iteratorHead.hasNext()) 
                { 
                    String headerName = iteratorHead.next(); 
                    String headerValue = (String) headers.get(headerName); 
                    MyLog.d(headerName, headerValue); 
                    get.setHeader(headerName, headerValue); 
                } 
            } 
                // connect 
                //need try catch 
                response = httpClient.execute(get); 

       3、Post请求: 

               HttpPost post = new HttpPost(KeySource.HOST_URL_STR); 
                // set HTTP head parameters 
                Map<String, String> headers = heads; 
                Set<String> setHead = headers.keySet(); 
                Iterator<String> iteratorHead = setHead.iterator(); 
                while (iteratorHead.hasNext()) 
                { 
                    String headName = iteratorHead.next(); 
                    String headValue = (String) headers.get(headName); 
                    post.setHeader(headName, headValue); 
                } 
              /** 
                     * 通常的HTTP实体需要在执行上下文的时候动态生成的。 
                     * HttpClient的提供使用EntityTemplate实体类和ContentProducer接口支持动态实体。 
                     * 内容制作是通过写需求的内容到一个输出流,每次请求的时候都会产生。 
                     * 因此,通过EntityTemplate创建实体通常是独立的,重复性好。 
                     */ 
              ContentProducer cp = new ContentProducer() 
                    { 
                        public void writeTo(OutputStream outstream) 
                                throws IOException 
                        { 
                            Writer writer = new OutputStreamWriter(outstream, 
                                    "UTF-8"); 
                            writer.write(requestBody); 
                            writer.flush(); 
                            writer.close(); 
                        } 
                    }; 
                    HttpEntity entity = new EntityTemplate(cp); 
                    post.setEntity(entity); 
                } 
                //connect ,need try catch 
                response = httpClient.execute(post);  


         4、请求Response响应处理: 

    if (response.getStatusLine().getStatusCode() == 200) 
                { 
                    // get response xml. 
                    /** 
                     * 因为直接调用toString可能会导致某些中文字符出现乱码的情况。所以此处使用toByteArray 
                     * 如果需要转成String对象,可以先调用EntityUtils.toByteArray()方法将消息实体转成byte数组, 
                     * 在由new String(byte[] bArray)转换成字符串。 
                     */ 
                    byte[] bResultXml = EntityUtils.toByteArray(response 
                            .getEntity()); 
                    if (bResultXml != null) 
                    { 
                            String  strXml = new String(bResultXml, "utf-8"); 
                    } 
               } 
             //Todo xmlAnalysis.. 





    3.java.net 联网详解 


    本篇幅我们漫游java.net包,按照网络方面的知识来逐步学习java网络编程,并给大家介绍一些小例子,边学习边写代码。 
    首先,IP地址 

    IP地址估计大家都明白,我们就直接来看java.net中的类吧。 

     

     

    详细介绍就不多说了,看2个简单的小例子如下:

    Java代码 
    1. String GetHostAddress (String strHostName)   
    2. {   
    3. InetAddress address =  null ;   
    4. try   
    5. {   
    6. address = InetAddress.getByName (strHostName);   
    7. }   
    8. catch (UnknownHostException e)   
    9. {   
    10. System.out.println(e.getMessage());   
    11. }   
    12. return  InetAddress.getHostAddress () ;   
    13. }   
    14.   
    15. void  GetAllIP (String strHostName)   
    16. {   
    17. InetAddress[] add =  null ;   
    18. try   
    19. {   
    20. add = InetAddress.getAllByName (strHostName);   
    21. for ( int  i= 0 ;i<addr.lenth;i++)   
    22. System.out.println(addr[i]);   
    23. }   
    24. catch (UnknownHostException e)   
    25. {   
    26. System.out.println(e.getMessage());   
    27. }   
    28. }  
    1. String GetHostAddress (String strHostName)  
    2. {  
    3. InetAddress address = null;  
    4. try  
    5. {  
    6. address = InetAddress.getByName (strHostName);  
    7. }  
    8. catch(UnknownHostException e)  
    9. {  
    10. System.out.println(e.getMessage());  
    11. }  
    12. return InetAddress.getHostAddress () ;  
    13. }  
    14.   
    15. void GetAllIP (String strHostName)  
    16. {  
    17. InetAddress[] add = null;  
    18. try  
    19. {  
    20. add = InetAddress.getAllByName (strHostName);  
    21. for(int i=0;i<addr.lenth;i++)  
    22. System.out.println(addr[i]);  
    23. }  
    24. catch(UnknownHostException e)  
    25. {  
    26. System.out.println(e.getMessage());  
    27. }  
    28. }  



    上面2个小例子很简单,但是有一点必须说明的,在写网络编程方面的,必须注意异常的捕获,网络异常是比较正常的现象,比如说当前网 络繁忙,网络连接 超时,更是“家常便饭”。因此在写网络编程的时候,必须养成捕获异常的好习惯,查看完函数说明后,必须要注意网络异常的说明。例如下图中的说明: 

      public static InetAddress   getByAddress  (byte[] ipAddress) 
    Since: API Level 1 

    Returns the InetAddress corresponding to the array of bytes. In the case of an IPv4 address there must be exactly 4 bytes and for IPv6 exactly 16 bytes. If not, an UnknownHostException is thrown. 

    The IP address is not validated by a name service. 

    The high order byte is ipAddress[0]. 
    Parameters 
    ipAddress is either a 4 (IPv4) or 16 (IPv6) byte long array. 
    Returns 

        * an InetAddress instance representing the given IP address ipAddress. 

    Throws 
    UnknownHostException if the given byte array has no valid length. 



    在使用getByAddress ()函数的时候就必须捕获UnknownHostException这个异常。 
    然后,URL地址 

     

     


    看到这个类,不仅让我想起来MFC在网络编程方面的复杂,一个 

    BOOL AFXAPI AfxParseURL(LPCTSTR pstrURL, DWORD& dwServiceType,CString& strServer, CString& strObject, INTERNET_PORT& nPort); 

    函数,让人看起来就感觉不知道在说明,在编写MFC网络编程方面的时候一般都会自己写个URL类,而在JAVA中的直接提供了这个类,让初学者看起 来明白多了。一个简单的例子如下:

    Java代码 
    1. Void EasyURL (String strURL)   
    2. {   
    3. URL url =  new  URL(strURL);   
    4. try   
    5. {   
    6. InputStream html = url.openStream ();   
    7. int  c;   
    8. do {   
    9. c= html.read();   
    10. cf(c!=- 1 ) System.out.println(( char )c);   
    11. while (c!=- 1 )   
    12. }   
    13. catch (IOException e)   
    14. {   
    15. System.out.println(e.getMessage());   
    16. }   
    17. }  
    1. Void EasyURL (String strURL)  
    2. {  
    3. URL url = new URL(strURL);  
    4. try  
    5. {  
    6. InputStream html = url.openStream ();  
    7. int c;  
    8. do{  
    9. c= html.read();  
    10. cf(c!=-1) System.out.println((char)c);  
    11. }while(c!=-1)  
    12. }  
    13. catch(IOException e)  
    14. {  
    15. System.out.println(e.getMessage());  
    16. }  
    17. }  




    其次,套接字socket类 

     

     

    套接字通信的基本思想比较简单,客户端建立一个到服务器的链接,一旦连接建立了,客户端就可以往套接字里写入数据,并向服务器发送数据;反过来,服 务器读取客户端写入套接字里的数据。几乎就那样简单,也许细节会复杂些,但是基本思想就这么简单。举个简单的例子如下:

    Java代码 
    1. void  WebPing (String strURL)   
    2. {   
    3. try   
    4. {   
    5. InetAddress addr;   
    6. Socket sock =  new  Socket(strURL, 80 );   
    7. Addr = sock.getInetAddress ();   
    8. System.out.println(“Connceted to”+addr);   
    9. Sock.close();   
    10. }   
    11. catch (IOException e)   
    12. {   
    13. System.out.println(e.getMessage());   
    14. }   
    15. }  
    1. void WebPing (String strURL)  
    2. {  
    3. try  
    4. {  
    5. InetAddress addr;  
    6. Socket sock = new Socket(strURL,80);  
    7. Addr = sock.getInetAddress ();  
    8. System.out.println(“Connceted to”+addr);  
    9. Sock.close();  
    10. }  
    11. catch(IOException e)  
    12. {  
    13. System.out.println(e.getMessage());  
    14. }  
    15. }  



    如果使用本地主机(localhost)来测试这个程序,输出结果如下: 
    Connceted to localhost/127.0.0.1 
    InetAddress.toString()的隐含调用(println调用)自动输出主机名和IP地址。 

    至于其他套接字:DatagramSocket (通过UDP通信的套接字),MulticastSocket (一 种用于多点传送的套接字)以及ServerSocket (一种用于监听来自客户端的连接的套接字),在这里就不一一说 明。 
    最后,URLConncetion类 

    在一般情况下,URL这个类就可以满足我们的需求,但是在一些特殊情况下,比如HTTP数据头的传递,这个时候我们就得使用 URLConncetion,如下图所示: 

     

     

    使用URLConncetion,我们对网络的控制就增加了很多,举个例子如下:

    Java代码 
    1. void  SendRequest (String strURL)   
    2. {   
    3. URL url = URL(strURL);   
    4. HttpURLConnection conn = (HttpURLConnection)url.openConnection ();   
    5. conn.setDoInput ( true );   
    6. conn.setDoOutput ( true );   
    7. conn.setRequestProperty (“Content-type”,”application/xxx”);   
    8. conn.connect ();   
    9. System.out.println(Conn.getResponseMessage ());   
    10. InputMessage is = Conn.getIputStream();   
    11. int  c;   
    12. do {   
    13. c = is.read();   
    14. if (c!=- 1 ) System.out.println(( char )c);   
    15. while (c!=- 1 )   
    16. }  
    1. void SendRequest (String strURL)  
    2. {  
    3. URL url = URL(strURL);  
    4. HttpURLConnection conn = (HttpURLConnection)url.openConnection ();  
    5. conn.setDoInput (true);  
    6. conn.setDoOutput (true);  
    7. conn.setRequestProperty (“Content-type”,”application/xxx”);  
    8. conn.connect ();  
    9. System.out.println(Conn.getResponseMessage ());  
    10. InputMessage is = Conn.getIputStream();  
    11. int c;  
    12. do{  
    13. c = is.read();  
    14. if(c!=-1) System.out.println((char)c);  
    15. }while(c!=-1)  
    16. }  




    关于HTTP数据头方面的知识,前段时间在编写流媒体下载的时候学习了下HTTP数据头的结构,下面列举一个HTTP request/response的一个完整流程如下,有兴趣的可以看下:

    1. 概要 

          本文主要介绍在Android平台上开发网络应用的一些常用接口。 

    2. Android平台上可以使用的几种网络接口 

    Android平台的网络应用绝大部分都是基于Java的编程接口的,也就是说我们开发类似的运用的时候可以有多种选择,比J2me确实好多了。 

    2.1. 标准Java接口 

    java.net.*下面提供了访问 HTTP 服务的基本功能。使用这部分接口的基本操作主要包括: 

    ·         创建 URL 以及 URLConnection / HttpURLConnection 对象 

    ·         设置连接参数 

    ·         连接到服务器 

    ·         向服务器写数据 

    ·         从服务器读取数据 

    import java.io.InputStream;   

            import java.io.OutputStream;   

            import java.net.URL;   

            import java.net.URLConnection;   

            import java.net.HttpURLConnection;   

      

            try {   

                // 创建一个 URL 对象   

                URL url = new URL(your_url);   

      

                // 创建一个 URL 连接,如果有代理的话可以指定一个代理。   

                URLConnection connection = url.openConnection(Proxy_yours);   

                // 对于 HTTP 连接可以直接转换成 HttpURLConnection,   

                // 这样就可以使用一些 HTTP 连接特定的方法,如 setRequestMethod() 等   

                //HttpURLConnection connection =   

                   (HttpURLConnection)url.openConnection(Proxy_yours);   

      

                // 在开始和服务器连接之前,可能需要设置一些网络参数   

                connection.setConnectTimeout(10000);   

                connection.addRequestProperty("User-Agent",   

                     "J2me/MIDP2.0");   

      

                // 连接到服务器   

                connection.connect();   

      

                // 往服务器写数据,数据会暂时被放到内存缓存区中   

                // 如果仅是一个简单的 HTTP GET,这一部分则可以省略   

                OutputStream outStream = connection.getOutputStream();   

                ObjectOutputStream objOutput = new ObjectOutputStream(outStream);   

                objOutput.writeObject(new String("this is a string..."));   

                objOutput.flush();   

      

                // 向服务器发送数据并获取应答   

                InputStream in = connection.getInputStream();   

      

                // 处理数据   

                ...   

      

            } catch (Exception e) {   

                // 网络读写操作往往会产生一些异常,所以在具体编写网络应用时   

                // 最好捕捉每一个具体以采取相应措施   

            }  

    2.2. Apache接口 

    Apache HttpClient 是一个开源项目,弥补了 java.net.* 灵活性不足的缺点,为客户端的HTTP编程提供高效、最新、功能丰富的工具包支持。Android 平台引入了 Apache HttpClient 的同时还提供了对它的一些封装和扩展,例如设置缺省的HTTP超时和缓存大小等。早期的 Android 曾同时包括 Commons HttpClient (org.apache.commons.httpclient.*) 和 HttpComponents (org.apache.http.client.* ),不过当前版本 (1.5) 中开发者只能使用后者,也就是说类似以下的一些类: 

    使用这部分接口的基本操作与 java.net.* 基本类似,主要包括: 

    ·         创建 HttpClient 以及 GetMethod / PostMethod, HttpRequest 等对象 

    ·         设置连接参数 

    ·         执行 HTTP 操作 

    ·         处理服务器返回结果 

    import org.apache.http.HttpEntity;   

           import org.apache.http.HttpHost;   

           import org.apache.http.HttpResponse;   

           import org.apache.http.auth.AuthScope;   

           import org.apache.http.auth.UsernamePasswordCredentials;   

           import org.apache.http.client.methods.HttpGet;   

           import org.apache.http.conn.params.ConnRoutePNames;   

           import org.apache.http.params. HttpConnectionParams;   

           import org.apache.http.client.params. HttpClientParams;   

      

           try {   

               // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)   

               HttpParams params = new BasicHttpParams();   

      

               // 设置连接超时和 Socket 超时,以及 Socket 缓存大小   

               HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);   

               HttpConnectionParams.setSoTimeout(params, 20 * 1000);   

               HttpConnectionParams.setSocketBufferSize(params, 8192);   

      

               // 设置重定向,缺省为 true   

               HttpClientParams.setRedirecting(params, true);   

      

               // 设置 user agent   

               HttpProtocolParams.setUserAgent(params, userAgent);   

                 

               // 创建一个 HttpClient 实例   

               // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient   

               // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient   

               HttpClient httpClient = new DefaultHttpClient(params);   

      

               // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向   

               HttpGet httpGet = new HttpGet ("http://www.test_test.com/");   

      

               HttpResponse response = client.execute(httpGet);   

               if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {   

                   // 错误处理,例如可以在该请求正常结束前将其中断   

                   httpGet.abort();   

               }   

      

               // 读取更多信息   

               Header[] headers = response.getHeaders();   

               HttpEntity entity = response.getEntity();   

               Header header = response.getFirstHeader("Content-Type");   

           } catch (Exception ee) {   

               //   

           } finally {   

               // 释放连接   

               client.getConnectionManager().shutdown();   

           }  

    import org.apache.http.HttpEntity; 

            import org.apache.http.HttpHost; 

            import org.apache.http.HttpResponse; 

            import org.apache.http.auth.AuthScope; 

            import org.apache.http.auth.UsernamePasswordCredentials; 

            import org.apache.http.client.methods.HttpGet; 

            import org.apache.http.conn.params.ConnRoutePNames; 

            import org.apache.http.params. HttpConnectionParams; 

            import org.apache.http.client.params. HttpClientParams; 

            try { 

                 // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的) 

                HttpParams params = new BasicHttpParams(); 

                // 设置连接超时和 Socket 超时,以及 Socket 缓存大小 

                HttpConnectionParams.setConnectionTimeout(params, 20 * 1000); 

                HttpConnectionParams.setSoTimeout(params, 20 * 1000); 

                HttpConnectionParams.setSocketBufferSize(params, 8192); 

                // 设置重定向,缺省为 true 

                HttpClientParams.setRedirecting(params, true); 

                // 设置 user agent 

               HttpProtocolParams.setUserAgent(params, userAgent); 

               

                // 创建一个 HttpClient 实例 

                // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient 

                // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient 

                HttpClient httpClient = new DefaultHttpClient(params); 

                // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向 

                HttpGet httpGet = new HttpGet ("http://www.test_test.com/"); 

                HttpResponse response = client.execute(httpGet); 

                if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { 

                    // 错误处理,例如可以在该请求正常结束前将其中断 

                    httpGet.abort(); 

                } 

                // 读取更多信息 

                Header[] headers = response.getHeaders(); 

                HttpEntity entity = response.getEntity(); 

                Header header = response.getFirstHeader("Content-Type"); 

            } catch (Exception ee) { 

                // 

            } finally { 

                // 释放连接 

                client.getConnectionManager().shutdown(); 

            } 

          以下例子以 HttpGet 方式通过代理访问 HTTPS 网站: 

    try {   

                HttpClient httpClient = new HttpClient();   

      

                // 设置认证的数据   

                httpClient.getCredentialsProvider().setCredentials(   

                        new AuthScope("your_auth_host", 80, "your_realm"),      

                        new UsernamePasswordCredentials("username", "password"));   

      

                // 设置服务器地址,端口,访问协议   

                HttpHost targetHost = new HttpHost("www.test_test.com", 443, "https");   

      

                // 设置代理   

                HttpHost proxy = new HttpHost("192.168.1.1", 80);   

                httpClient.getParams().setParameter   

                     (ConnRoutePNames.DEFAULT_PROXY, proxy);      

      

                // 创建一个 HttpGet 实例   

                HttpGet httpGet = new HttpGet("/a/b/c");   

      

                // 连接服务器并获取应答数据   

                HttpResponse response = httpClient.execute(targetHost, httpGet);   

      

                // 读取应答数据   

                int statusCode = response.getStatusLine().getStatusCode();   

                Header[] headers = response.getHeaders();   

                HttpEntity entity = response.getEntity();   

            } catch (Exception ee) {  

    关键字: android net

    1. 概要

          本文主要介绍在 Android 平台上开发网络应用的一些常用接口。

    2. Android 平台上可以使用的几种网络接口

    Android 平台的网络应用绝大部分都是基于 Java 的编程接口的,也就是说我们开发类似的运用的时候可以有多种选择,比J2me 确实好多了。

    2.1. 标准 Java 接口

    java.net.* 下面提供了访问 HTTP 服务的基本功能。使用这部分接口的基本操作主要包括:

    • 创建 URL 以及 URLConnection / HttpURLConnection 对象
    • 设置连接参数
    • 连接到服务器
    • 向服务器写数据
    • 从服务器读取数据  

    import  java.io.InputStream;   

            import  java.io.OutputStream;   

            import  java.net.URL;   

            import  java.net.URLConnection;   

            import  java.net.HttpURLConnection;   

      

            try  {   

                //  创建一个  URL  对象   

               URL url =  new  URL(your_url);   

      

                //  创建一个  URL  连接,如果有代理的话可以指定一个代理。   

               URLConnection connection = url.openConnection(Proxy_yours);   

                //  对于  HTTP  连接可以直接转换成  HttpURLConnection ,   

                //  这样就可以使用一些  HTTP  连接特定的方法,如  setRequestMethod()  等   

                //HttpURLConnection connection =    

                  (HttpURLConnection)url.openConnection(Proxy_yours);   

      

                //  在开始和服务器连接之前,可能需要设置一些网络参数   

               connection.setConnectTimeout( 10000 );   

               connection.addRequestProperty( "User-Agent" ,    

                     "J2me/MIDP2.0" );   

      

                //  连接到服务器   

               connection.connect();   

      

                //  往服务器写数据,数据会暂时被放到内存缓存区中   

                //  如果仅是一个简单的  HTTP GET ,这一部分则可以省略   

               OutputStream outStream = connection.getOutputStream();   

               ObjectOutputStream objOutput =  new  ObjectOutputStream(outStream);   

               objOutput.writeObject( new  String( "this is a string..." ));   

               objOutput.flush();   

      

                //  向服务器发送数据并获取应答   

               InputStream in = connection.getInputStream();   

      

                //  处理数据   

               ...   

      

           }  catch  (Exception e) {   

                //  网络读写操作往往会产生一些异常,所以在具体编写网络应用时   

                //  最好捕捉每一个具体以采取相应措施   

           }  

      2.2. Apache 接口  

      Apache HttpClient 是一个开源项目,弥补了 java.net.* 灵活性不足的缺点,为客户端的 HTTP 编程提供高效、最新、功能丰富的工具包支持。 Android 平台引入了 Apache HttpClient 的同时还提供了对它的一些封装和扩展,例如设置缺省的 HTTP 超时和缓存大小等。早期的 Android 曾同时包括 Commons HttpClient (org.apache.commons.httpclient.* ) 和 HttpComponents  ( org.apache.http.client.* ),不过当前版本 (1.5) 中开发者只能使用后者,也就是说类似以下的一些类:

    使用这部分接口的基本操作与 java.net.* 基本类似,主要包括:

    • 创建 HttpClient 以及 GetMethod / PostMethod , HttpRequest 等对象
    • 设置连接参数
    • 执行 HTTP 操作
    • 处理服务器返回结果

    import  org.apache.http.HttpEntity;   

           import  org.apache.http.HttpHost;   

           import  org.apache.http.HttpResponse;   

           import  org.apache.http.auth.AuthScope;   

           import  org.apache.http.auth.UsernamePasswordCredentials;   

           import  org.apache.http.client.methods.HttpGet;   

           import  org.apache.http.conn.params.ConnRoutePNames;   

           import  org.apache.http.params. HttpConnectionParams;   

           import  org.apache.http.client.params. HttpClientParams;   

      

           try  {   

               //  创建  HttpParams  以用来设置  HTTP  参数(这一部分不是必需的)   

              HttpParams params =  new  BasicHttpParams();   

      

               //  设置连接超时和  Socket  超时,以及  Socket  缓存大小   

              HttpConnectionParams.setConnectionTimeout(params,  20  *  1000 );   

              HttpConnectionParams.setSoTimeout(params,  20  *  1000 );   

              HttpConnectionParams.setSocketBufferSize(params,  8192 );   

      

               //  设置重定向,缺省为  true   

              HttpClientParams.setRedirecting(params,  true );   

      

               //  设置  user agent   

              HttpProtocolParams.setUserAgent(params, userAgent);   

                 

               //  创建一个  HttpClient  实例   

               //  注意  HttpClient httpClient = new HttpClient();  是 Commons HttpClient    

               //  中的用法,在  Android 1.5  中我们需要使用  Apache  的缺省实现  DefaultHttpClient   

              HttpClient httpClient =  new  DefaultHttpClient(params);   

      

               //  创建  HttpGet  方法,该方法会自动处理  URL  地址的重定向   

              HttpGet httpGet =  new  HttpGet ( "http://www.test_test.com/" );   

      

              HttpResponse response = client.execute(httpGet);   

               if  (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {   

                   //  错误处理,例如可以在该请求正常结束前将其中断   

                  httpGet.abort();   

              }   

      

               //  读取更多信息   

              Header[] headers = response.getHeaders();   

              HttpEntity entity = response.getEntity();   

              Header header = response.getFirstHeader( "Content-Type" );   

          }  catch  (Exception ee) {   

               //   

          }  finally  {   

               //  释放连接   

              client.getConnectionManager().shutdown();    

          }  

      import org.apache.http.HttpEntity;

            import org.apache.http.HttpHost;

            import org.apache.http.HttpResponse;

            import org.apache.http.auth.AuthScope;

            import org.apache.http.auth.UsernamePasswordCredentials;

            import org.apache.http.client.methods.HttpGet;

            import org.apache.http.conn.params.ConnRoutePNames;

            import org.apache.http.params. HttpConnectionParams;

            import org.apache.http.client.params. HttpClientParams;

     

            try {

                 // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)

                HttpParams params = new BasicHttpParams();

     

                // 设置连接超时和 Socket 超时,以及 Socket 缓存大小

                HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);

                HttpConnectionParams.setSoTimeout(params, 20 * 1000);

                HttpConnectionParams.setSocketBufferSize(params, 8192);

     

                // 设置重定向,缺省为 true

                HttpClientParams.setRedirecting(params, true);

     

                // 设置 user agent

                 HttpProtocolParams.setUserAgent(params, userAgent);

               

                // 创建一个 HttpClient 实例

                // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient

                // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient

                HttpClient httpClient = new DefaultHttpClient(params);

     

                // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向

                HttpGet httpGet = new HttpGet ("http://www.test_test.com/");

     

                HttpResponse response = client.execute(httpGet);

                if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

                    // 错误处理,例如可以在该请求正常结束前将其中断

                    httpGet.abort();

                }

     

                // 读取更多信息

                Header[] headers = response.getHeaders();

                HttpEntity entity = response.getEntity();

                Header header = response.getFirstHeader("Content-Type");

            } catch (Exception ee) {

                //

            } finally {

                // 释放连接

                client.getConnectionManager().shutdown();

            }

          以下例子以 HttpGet 方式通过代理访问 HTTPS 网站:

    try  {   

               HttpClient httpClient =  new  HttpClient();   

      

                //  设置认证的数据   

               httpClient.getCredentialsProvider().setCredentials(   

                        new  AuthScope( "your_auth_host" ,  80 ,  "your_realm" ),      

                        new  UsernamePasswordCredentials( "username" ,  "password" ));   

      

                //  设置服务器地址,端口,访问协议   

               HttpHost targetHost =  new  HttpHost( "www.test_test.com" ,  443 ,  "https" );   

      

                //  设置代理   

               HttpHost proxy =  new  HttpHost( "192.168.1.1" ,  80 );   

               httpClient.getParams().setParameter   

                    (ConnRoutePNames.DEFAULT_PROXY, proxy);      

      

                //  创建一个  HttpGet  实例   

               HttpGet httpGet =  new  HttpGet( "/a/b/c" );   

      

                //  连接服务器并获取应答数据   

               HttpResponse response = httpClient.execute(targetHost, httpGet);   

      

                //  读取应答数据   

                int  statusCode = response.getStatusLine().getStatusCode();   

               Header[] headers = response.getHeaders();   

               HttpEntity entity = response.getEntity();   

           }  catch  (Exception ee) {   

  • 相关阅读:
    用外部表的方式查询当天数据库alert日志文件
    比较数据泵和exp/imp对相同数据导出/导入的性能差异
    理解Oracle TM和TX锁
    Rocky4.2下安装金仓v7数据库(KingbaseES)
    理解listagg函数
    sql*loader的直接加载方式和传统加载方式的性能差异
    Rocky4.2下安装达梦(DM)6数据库
    演示对sys用户和普通用户进行审计的示例
    演示一个通过触发器进行审计的示例
    演示一个使用db vault进行安全控制的示例
  • 原文地址:https://www.cnblogs.com/xingmeng/p/2441013.html
Copyright © 2011-2022 走看看