Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序。以下是本人在学习中的总结与归纳。

     HttpClient实际上是对Java提供方法的一些封装,在HttpURLConnection中的输入输出流操作,在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,这样,就减少了操作的繁琐性。

    另外,在使用POST方式进行传输时,需要进行字符编码。

Manifest文件中权限的设定:

Xml代码 
<uses-permission android:name="android.permission.INTERNET" />

1. HttpURLConnection接口


      首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http请求中。因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式。

 

      HttpURLConnection是继承于URLConnection类,二者都是抽象类。其对象主要通过URL的openConnection方法获得。创建方法如下代码所示:


Java代码  

Android NetlinkEvent 没有触发_上传


1. new
2.  HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();

    通过以下方法可以对请求的属性进行一些设置,如下所示

  


Java代码  

Android NetlinkEvent 没有触发_上传

1. //设置输入和输出流  
2. true);    
3. true);    
4. //设置请求方式为POST  
5.  urlConn.setRequestMethod("POST");    
6. //POST请求不能使用缓存  
7. false);   
8. //关闭连接  
9.  urlConn.disConnection();

HttpURLConnection默认使用GET方式,例如下面代码所示:


Java代码  

Android NetlinkEvent 没有触发_上传

1. //以Get方式上传参数
2. public class Activity03 extends
3.  {  
4. private final
5. /** Called when the activity is first created. */
6. @Override
7. public void
8.      {  
9. super.onCreate(savedInstanceState);  
10.          setContentView(R.layout.http);    
11. this.findViewById(R.id.TextView_HTTP);  
12. //http地址"?par=abcdefg"是我们上传的参数
13.          String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=abcdefg";  
14. //获得的数据
15.          String resultData = "";  
16. null;  
17. try
18.          {  
19. //构造一个URL对象
20. new
21.          }  
22. catch
23.          {  
24.              Log.e(DEBUG_TAG, "MalformedURLException");  
25.          }  
26. if (url != null)  
27.          {  
28. try
29.              {  
30. // 使用HttpURLConnection打开连接
31.                  HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
32. //得到读取的内容(流)
33. new
34. // 为输出创建BufferedReader
35. new
36. null;  
37. //使用循环来读取获得的数据
38. while (((inputLine = buffer.readLine()) != null))  
39.                  {  
40. //我们在每一行后面加上一个"\n"来换行
41.                      resultData += inputLine + "\n";  
42.                  }           
43. //关闭InputStreamReader
44.                  in.close();  
45. //关闭http连接
46.                  urlConn.disconnect();  
47. //设置显示取得的内容
48. if ( resultData != null
49.                  {  
50.                      mTextView.setText(resultData);  
51.                  }  
52. else
53.                  {  
54.                      mTextView.setText("读取的内容为NULL");  
55.                  }  
56.              }  
57. catch
58.              {  
59.                  Log.e(DEBUG_TAG, "IOException");  
60.              }  
61.          }  
62. else
63.          {  
64.              Log.e(DEBUG_TAG, "Url NULL");  
65.          }  
66.  }

  如果需要使用POST方式,则需要setRequestMethod设置。代码如下:


Java代码  

Android NetlinkEvent 没有触发_上传


1. //以post方式上传参数
2. public class Activity04  extends
3.  {  
4. private final
5. /** Called when the activity is first created. */
6. @Override
7. public void
8.      {  
9. super.onCreate(savedInstanceState);  
10.          setContentView(R.layout.http);  
11.            
12. this.findViewById(R.id.TextView_HTTP);  
13. //http地址"?par=abcdefg"是我们上传的参数
14.          String httpUrl = "http://192.168.1.110:8080/httpget.jsp";  
15. //获得的数据
16.          String resultData = "";  
17. null;  
18. try
19.          {  
20. //构造一个URL对象
21. new
22.          }  
23. catch
24.          {  
25.              Log.e(DEBUG_TAG, "MalformedURLException");  
26.          }  
27. if (url != null)  
28.          {  
29. try
30.              {  
31. // 使用HttpURLConnection打开连接
32.                  HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
33. //因为这个是post请求,设立需要设置为true
34. true);  
35. true);  
36. // 设置以POST方式
37.                  urlConn.setRequestMethod("POST");  
38. // Post 请求不能使用缓存
39. false);  
40. true);  
41. // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
42.                  urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
43. // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
44. // 要注意的是connection.getOutputStream会隐含的进行connect。
45.                  urlConn.connect();  
46. //DataOutputStream流
47. new
48. //要上传的参数
49.                  String content = "par=" + URLEncoder.encode("ABCDEFG", "gb2312");  
50. //将要上传的内容写入流中
51.                  out.writeBytes(content);   
52. //刷新、关闭
53.                  out.flush();  
54.                  out.close();   
55. //获取数据
56. new BufferedReader(new
57. null;  
58. //使用循环来读取获得的数据
59. while (((inputLine = reader.readLine()) != null))  
60.                  {  
61. //我们在每一行后面加上一个"\n"来换行
62.                      resultData += inputLine + "\n";  
63.                  }           
64.                  reader.close();  
65. //关闭http连接
66.                  urlConn.disconnect();  
67. //设置显示取得的内容
68. if ( resultData != null
69.                  {  
70.                      mTextView.setText(resultData);  
71.                  }  
72. else
73.                  {  
74.                      mTextView.setText("读取的内容为NULL");  
75.                  }  
76.              }  
77. catch
78.              {  
79.                  Log.e(DEBUG_TAG, "IOException");  
80.              }  
81.          }  
82. else
83.          {  
84.              Log.e(DEBUG_TAG, "Url NULL");  
85.          }  
86.      }  
87.  }


 2. HttpClient接口
 使用Apache提供的HttpClient接口同样可以进行HTTP操作。
 对于GET和POST请求方法的操作有所不同。GET方法的操作代码示例如下:


Java代码  

Android NetlinkEvent 没有触发_上传


1. public class Activity02 extends
2.  {  
3. /** Called when the activity is first created. */
4. @Override
5. public void
6.      {  
7. super.onCreate(savedInstanceState);  
8.          setContentView(R.layout.http);  
9. this.findViewById(R.id.TextView_HTTP);  
10. // http地址
11.          String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get";  
12. //HttpGet连接对象
13. new
14. try
15.          {  
16. //取得HttpClient对象
17. new
18. //请求HttpClient,取得HttpResponse
19.              HttpResponse httpResponse = httpclient.execute(httpRequest);  
20. //请求成功
21. if
22.              {  
23. //取得返回的字符串
24.                  String strResult = EntityUtils.toString(httpResponse.getEntity());  
25.                  mTextView.setText(strResult);  
26.              }  
27. else
28.              {  
29.                  mTextView.setText("请求错误!");  
30.              }  
31.          }  
32. catch
33.          {  
34.              mTextView.setText(e.getMessage().toString());  
35.          }  
36. catch
37.          {  
38.              mTextView.setText(e.getMessage().toString());  
39.          }  
40. catch
41.          {  
42.              mTextView.setText(e.getMessage().toString());  
43.          }    
44.        
45.              }  
46.  }

  使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数,另外,还需要设置所使用的字符集。代码如下所示:


Java代码  

Android NetlinkEvent 没有触发_上传


1. public class Activity03 extends
2.  {  
3. /** Called when the activity is first created. */
4. @Override
5. public void
6.      {  
7. super.onCreate(savedInstanceState);  
8.          setContentView(R.layout.http);  
9. this.findViewById(R.id.TextView_HTTP);  
10. // http地址
11.          String httpUrl = "http://192.168.1.110:8080/httpget.jsp";  
12. //HttpPost连接对象
13. new
14. //使用NameValuePair来保存要传递的Post参数
15. new
16. //添加要传递的参数
17. new
18. try
19.          {  
20. //设置字符集
21. new
22. //请求httpRequest
23.              httpRequest.setEntity(httpentity);  
24. //取得默认的HttpClient
25. new
26. //取得HttpResponse
27.              HttpResponse httpResponse = httpclient.execute(httpRequest);  
28. //HttpStatus.SC_OK表示连接成功
29. if
30.              {  
31. //取得返回的字符串
32.                  String strResult = EntityUtils.toString(httpResponse.getEntity());  
33.                  mTextView.setText(strResult);  
34.              }  
35. else
36.              {  
37.                  mTextView.setText("请求错误!");  
38.              }  
39.          }  
40. catch
41.          {  
42.              mTextView.setText(e.getMessage().toString());  
43.          }  
44. catch
45.          {  
46.              mTextView.setText(e.getMessage().toString());  
47.          }  
48. catch
49.          {  
50.              mTextView.setText(e.getMessage().toString());  
51.          }    
52.      }  
53.  }

 

3 Socket编程实例:

          创建一个java 类作为服务器,android 应用程序作为客户端

          服务器端代码:


[html]  view plain copy


1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:layout_width="fill_parent"
4. android:layout_height="fill_parent"
5. android:orientation="vertical" >
6.   
7. <Button
8. android:id="@+id/rev"
9. android:text="开始接收"
10. android:layout_width="fill_parent"
11. android:layout_height="wrap_content"/>
12.       
13. <TextView
14. android:id="@+id/receiver"
15. android:layout_width="fill_parent"
16. android:layout_height="wrap_content"
17. android:text="Is Reveiving...." />
18.   
19. </LinearLayout>


AndroidManifest.xml


[java]  view plain copy


1. package com.client;  
2.   
3. import java.io.IOException;  
4. import java.io.InputStream;  
5. import java.net.Socket;  
6. import java.net.UnknownHostException;  
7.   
8. import android.app.Activity;  
9. import android.os.Bundle;  
10. import android.view.View;  
11. import android.view.View.OnClickListener;  
12. import android.widget.Button;  
13. import android.widget.TextView;  
14.   
15. public class MyClientActivity extends Activity {  
16.     /** Called when the activity is first created. */  
17.     private Button rev=null;  
18.     private TextView revtext=null;  
19. @Override
20.     public void onCreate(Bundle savedInstanceState) {  
21.         super.onCreate(savedInstanceState);  
22.         setContentView(R.layout.main);  
23.         rev=(Button)findViewById(R.id.rev);      
24.         revtext=(TextView)findViewById(R.id.receiver);  
25.         rev.setOnClickListener(new receiverlistenr());  
26.     }  
27.     class receiverlistenr implements OnClickListener{  
28.         public void onClick(View v) {  
29.             // TODO Auto-generated method stub  
30.             try {  
31.                 //实例化Socket  
32. 8888);  
33.                 //获得输入流  
34.                 InputStream in=socket.getInputStream();  
35.                 //缓冲区  
36.                 byte[] buffer=new byte[in.available()];  
37.                 //读取缓冲区  
38.                 in.read(buffer);  
39.                 //转换字符串  
40.                 String msg=new String(buffer);  
41.                 //设置文本框的字符串  
42.                 revtext.setText(msg);  
43.             } catch (UnknownHostException e) {  
44.                 // TODO Auto-generated catch block  
45.                 e.printStackTrace();  
46.             } catch (IOException e) {  
47.                 // TODO Auto-generated catch block  
48.                 e.printStackTrace();  
49.             }  
50.               
51.         }  
52.     }  
53. }