与互联网互访数据

Android 从网络上获取数据

1. 普通 J2EE 代码下的网络编程
  1. public class ImageTool {  
  2.     public static void main(String[] args) throws Exception {  
  3.         String path = "http://hiphotos.baidu.com/z%D6%DCy%D4%C6f%B7%E5/pic/item/6ca59b1de32de389a5866972.jpg";  
  4.         URL url = new URL(path);  
  5.         // GET 必须大写  
  6.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  7.         conn.setRequestMethod("GET");  
  8.         // 超时 5秒  
  9.         conn.setReadTimeout(5 * 1000);  
  10.         InputStream is = conn.getInputStream();  
  11.          
  12.         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  13.          
  14.         byte[] buffer = new byte[1024];  
  15.         int len;  
  16.         while((len = is.read(buffer)) != -1 ) {  
  17.             bos.write(buffer, 0, len);  
  18.         }  
  19.          
  20.         byte[] data = bos.toByteArray();  
  21.         File file = new File("zhiling.jpg");  
  22.          
  23.         FileOutputStream fos = new FileOutputStream(file);  
  24.         fos.write(data);  
  25.         fos.close();  
  26.     }  
  27. }  


2. 链接网络权限
    <uses-permission android:name="android.permission.INTERNET"/>

3. ImageView : 显示图片的控件
    imageView.setImageBitmap(Bitmap);
4. Bitmap : 位图
    Bitmap bitmap = BitmapFactory.decodeByteArray(ByteArray, 0, ByteArray.length);


5.代码示例 : 获取网络上的一张图片,显示在 Android 手机上
    1. AndroidManifest.xml -- 声明链接网络的权限
    
      
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.         <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.               package="wjh.android.image"  
  4.               android:versionCode="1"  
  5.               android:versionName="1.0">  
  6.             <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.                 <activity android:name=".ImageActivity"  
  8.                           android:label="@string/app_name">  
  9.                     <intent-filter>  
  10.                         <action android:name="android.intent.action.MAIN" />  
  11.                         <category android:name="android.intent.category.LAUNCHER" />  
  12.                     </intent-filter>  
  13.                 </activity>  
  14.          
  15.             </application>  
  16.             <uses-sdk android:minSdkVersion="8" />  
  17.             <!-- 访问网络权限 -->  
  18.             <uses-permission android:name="android.permission.INTERNET"/>  
  19.         </manifest>   

        
    2. main.xml -- 布局
    
       
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.         <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.             android:orientation="vertical"  
  4.             android:layout_width="fill_parent"  
  5.             android:layout_height="fill_parent"  
  6.             >  
  7.             <TextView   
  8.                 android:layout_width="fill_parent"  
  9.                 android:layout_height="wrap_content"  
  10.                 android:text="@string/path"  
  11.                 />  
  12.             <EditText  
  13.                     android:layout_width="fill_parent"  
  14.                     android:layout_height="wrap_content"  
  15.                      android:text="http://hiphotos.baidu.com/z%D6%DCy%D4%C6f%B7%E5/pic/item/6ca59b1de32de389a5866972.jpg"  
  16.                      android:id="@+id/path"  
  17.                     />  
  18.                 <Button  
  19.                     android:layout_width="wrap_content"  
  20.                     android:layout_height="wrap_content"  
  21.                     android:text="@string/button"  
  22.                     android:id="@+id/button"  
  23.                     />  
  24.             <!-- 显示图片的控件  -->  
  25.             <ImageView  
  26.                     android:layout_width="wrap_content"  
  27.                     android:layout_height="wrap_content"  
  28.                     android:id="@+id/image"  
  29.                     />  
  30. </LinearLayout>  

    
    3. strings.xml  -- 字符串定义
        
       
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.             <string name="hello">Hello World, ImageActivity!</string>  
  4.             <string name="app_name">图片查看器</string>  
  5.             <string name="path">图片路径</string>  
  6.             <string name="button">查看</string>  
  7.             <string name="error">获取失败</string>  
  8. </resources>  

    
    4. Service -- 获取网络上的图片的字节数组
    
       
  1. package wjh.android.image.service;  
  2.         import java.io.ByteArrayOutputStream;  
  3.         import java.io.InputStream;  
  4.         import java.net.HttpURLConnection;  
  5.         import java.net.URL;  
  6.          
  7.         public class ImageService {  
  8.             public static byte[] catchImage(String path) throws Exception {  
  9.                 URL url = new URL(path);  
  10.                 // GET  
  11.                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  12.                 conn.setRequestMethod("GET");  
  13.                 // 超时 5秒  
  14.                 conn.setReadTimeout(5 * 1000);  
  15.          
  16.                 InputStream is = conn.getInputStream();  
  17.                  
  18.                 ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  19.                  
  20.                 byte[] buffer = new byte[1024];  
  21.                 int len;  
  22.                 while((len = is.read(buffer)) != -1 ) {  
  23.                     bos.write(buffer, 0, len);  
  24.                 }  
  25.                  
  26.                 is.close();  
  27.                 bos.close();  
  28.                  
  29.                 return bos.toByteArray();  
  30.             }  
  31. }  

    
    5. Main Activity

      
  1. public class ImageActivity extends Activity {  
  2.             private Button button;  
  3.             private EditText pathText;  
  4.             private ImageView imageView;  
  5.              
  6.             private static final String TAG = "ImageActivity";  
  7.              
  8.             @Override  
  9.             public void onCreate(Bundle savedInstanceState) {  
  10.                 super.onCreate(savedInstanceState);  
  11.                 setContentView(R.layout.main);  
  12.                 button = (Button) findViewById(R.id.button);  
  13.                 imageView = (ImageView) findViewById(R.id.image);  
  14.                 pathText = (EditText) findViewById(R.id.path);  
  15.                  
  16.                 button.setOnClickListener(new View.OnClickListener() {  
  17.                      
  18.                     @Override  
  19.                     public void onClick(View v) {  
  20.                         String path = pathText.getText().toString();  
  21.                         try {  
  22.                             // 获取图片数据  
  23.                             byte[] imageBytes = ImageService.catchImage(path);  
  24.                             Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);  
  25.                             imageView.setImageBitmap(bitmap);  
  26.                         } catch (Exception e) {  
  27.                             Log.i(TAG, e.toString());  
  28.                             Toast.makeText(ImageActivity.this, R.string.error, Toast.LENGTH_LONG);  
  29.                         }  
  30.                     }  
  31.                 });  
  32.             }  
  33. }  

        
    
    6. 从网络上获取视频的最新资讯(从网络上获取 XML 数据)
       ①  新建 web project  -- myvideoweb
           本项目采用 struts 为视图层框架
           
             ** Service
                
  1. public class VideoServiceImpl implements VideoService {  
  2.               /** 
  3.                * 获取最新视频资讯 
  4.                */  
  5.               public List<VideoMessage> getLastVideoMesasages() {  
  6.                   List<VideoMessage> vms = new ArrayList<VideoMessage>();  
  7.                    
  8.                   vms.add(new VideoMessage(89"喜羊羊与灰太狼全集"67));  
  9.                   vms.add(new VideoMessage(12"实拍舰载直升东海救援演习"23));  
  10.                   vms.add(new VideoMessage(19"喀麦隆VS荷兰"90));  
  11.                    
  12.                   return vms;  
  13.               }  

          ** Action
          
  1.   public class VideoAction extends Action {  
  2.                 private VideoService service = new VideoServiceImpl();  
  3.                  
  4.                 @Override  
  5.                 public ActionForward execute(ActionMapping mapping, ActionForm form,  
  6.                         HttpServletRequest request, HttpServletResponse response)  
  7.                         throws Exception {  
  8.                     List<VideoMessage> vms = service.getLastVideoMesasages();  
  9.                     request.setAttribute("videos", vms);  
  10.                     return mapping.findForward("videoListPage");  
  11.                 }  
  12. }  

          ** View
           
  1. <%@ page language="java" contentType="text/xml; charset=UTF-8"  
  2.                 pageEncoding="UTF-8"%>                                 <!-- 注意,最好将 XMl 声明放在第一行。否则可能解析出错。  -->  
  3.             <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><?xml version="1.0" encoding="UTF-8"?>  
  4.             <videos>  
  5.                 <c:forEach items="${videos}" var="video">  
  6.                         <video id="${video.id}">  
  7.                             <title>${video.title}</title>  
  8.                             <timelength>${video.timeLength}</timelength>  
  9.                         </video>  
  10.                 </c:forEach>  
  11. </videos>  

           ** 若访问 http://localhost:8080/myvideoweb/video/list.do,结果为:
          
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2.             - <videos>  
  3.                 - <video id="89">  
  4.                       <title>喜羊羊与灰太狼全集</title>  
  5.                       <timelength>67</timelength>  
  6.                   </video>  
  7.                 - <video id="12">  
  8.                       <title>实拍舰载直升东海救援演习</title>  
  9.                       <timelength>23</timelength>  
  10.                   </video>  
  11.                 - <video id="19">  
  12.                       <title>喀麦隆VS荷兰</title>  
  13.                       <timelength>90</timelength>  
  14.                   </video>  
  15. </videos>  

        
       ② 新建 Android 项目
           ** Service
           
  1. public class VideoService {  
  2.                 /** 
  3.                  * 解析从网络上获取到的 XML 文档。返回解析后的 VideoMessage 集合 
  4.                  */  
  5.                 public static List<VideoMessage> getLastVideos() throws Throwable {  
  6.                     // 注意,这里不能写为 localhost 和 127.0.0.1,因为程序最终会在手机上运行。它们就代表手机本身的 ip 了。这里应该写成电脑的本机 IP Addr.  
  7.                     String path = "http://10.4.74.20:8080/myvideoweb/video/list.do";  
  8.                     URL url = new URL(path);  
  9.              
  10.                     HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  11.                     conn.setConnectTimeout(5 * 1000);  
  12.                     conn.setRequestMethod("GET");  
  13.              
  14.                     InputStream is = conn.getInputStream();  
  15.              
  16.                     return parseXML(is);  
  17.                 }  
  18.              
  19.                 /** 
  20.                  * 从指定输入流中解析出 VideoMessage 集合并返回 
  21.                  */  
  22.                 private static List<VideoMessage> parseXML(InputStream is) throws Exception {  
  23.                     List<VideoMessage> videos = null;  
  24.                     VideoMessage vs = null;  
  25.              
  26.                     XmlPullParser pullParser = Xml.newPullParser();  
  27.                     pullParser.setInput(is, "UTF-8");  
  28.              
  29.                     int eventType = pullParser.getEventType(); // 触发第一个事件  
  30.                     while (eventType != XmlPullParser.END_DOCUMENT) { // 如果不为文档结束事件  
  31.                         switch (eventType) {  
  32.                         case XmlPullParser.START_DOCUMENT: // 文档开始事件  
  33.                             videos = new ArrayList<VideoMessage>();  
  34.                             break;  
  35.                         case XmlPullParser.START_TAG:  // 标签开始事件  
  36.                             if ("video".equals(pullParser.getName())) {  
  37.                                 int id = Integer.parseInt(pullParser.getAttributeValue(0));  
  38.              
  39.                                 vs = new VideoMessage();  
  40.                                 vs.setId(id);  
  41.                             }  
  42.                             if (vs != null) {  
  43.                                 if ("title".equals(pullParser.getName())) {  
  44.                                     vs.setTitle(pullParser.nextText());  
  45.                                 }  
  46.                                 if ("timelength".equals(pullParser.getName())) {  
  47.                                     vs.setTimeLength(Integer.parseInt((pullParser  
  48.                                             .nextText())));  
  49.                                 }  
  50.                             }  
  51.                             break;  
  52.                         case XmlPullParser.END_TAG:  // 标签结束事件  
  53.                             if ("video".equals(pullParser.getName())) {  
  54.                                 videos.add(vs);  
  55.                                 vs = null;  
  56.                             }  
  57.                             break;  
  58.                         }  
  59.                         eventType = pullParser.next();  
  60.                     }  
  61.              
  62.                     return videos;  
  63.                 }  
  64. }  

       ③.Main Activity
         
  1. public class ManiActivity extends Activity {  
  2.             private static final String TAG = "ManiActivity";  
  3.             private ListView listView;  
  4.              
  5.             @Override  
  6.             public void onCreate(Bundle savedInstanceState) {  
  7.                 super.onCreate(savedInstanceState);  
  8.                 setContentView(R.layout.main);  
  9.                 List<VideoMessage> vms = null;  
  10.                  
  11.                 // 调用 Service  
  12.                 try {  
  13.                 vms = VideoService.getLastVideos();  
  14.             } catch (Throwable e) {  
  15.                 e.printStackTrace();  
  16.                 Log.e(TAG, e.toString());  
  17.                 Toast.makeText(this, R.string.error, Toast.LENGTH_LONG);  
  18.             }  
  19.              
  20.             // 给 ListView 绑定显示数据  
  21.             listView = (ListView) findViewById(R.id.listView);  
  22.              
  23.              List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();  
  24.              for (VideoMessage vm : vms) {  
  25.                 Map<String, Object> item = new HashMap<String, Object>();  
  26.                 item.put("title", vm.getTitle());  
  27.                 item.put("timelength", vm.getTimeLength());  
  28.                 data.add(item);  
  29.             }  
  30.                 ListAdapter adapter = new SimpleAdapter(this, data, R.layout.item,  
  31.                         new String[]{"title""timelength"}, new int[]{R.id.title, R.id.timelength});  
  32.                  
  33.                 listView.setAdapter(adapter);  
  34.             }  
  35. }  

                
        8 Android JSON    
       
  1. public void testJson() throws Throwable {  
  2.             // JSONArray 的构造参数,是一个 JSON 数组,数组中的每个元素都是一个标准的 JSON 数据。  
  3.             JSONArray jsonArray =  new JSONArray("[{name:'wjh', age:10, addr:'sc'}], [{name='java', age=15, addr='arr'}]");  
  4.             Log.i(TAG, jsonArray.getJSONObject(0).getString("age")); // print:10  
  5.              
  6.             jsonArray =  new JSONArray("[{name:'wjh', age:10, addr:'sc'},{name:'wjh2', age:102, addr:'sc2'}]");  
  7.             Log.i(TAG, jsonArray.getJSONObject(1).getString("name")); // print:wjh2  
  8. }   


    9. 获取 json 格式的数据
        **服务器端 Action
           
  1. public ActionForward execute(ActionMapping mapping, ActionForm form,  
  2.                 HttpServletRequest request, HttpServletResponse response)  
  3.                 throws Exception {  
  4.                 VideoForm formbean = (VideoForm)form;  
  5.                 List<Video> videos = service.getLastVides();  
  6.                  
  7.                 // 当接收到 format=json 参数时执行 if 内部操作         
  8.                 if("json".equals(formbean.getFormat())){  
  9.                     //[{id:32,title:"喀麦隆VS荷兰",timelength:40},{id:32,title:"喀麦隆VS荷兰",timelength:40}]  
  10.                      
  11.                     // 组装 json 格式的数据  
  12.                     StringBuilder json = new StringBuilder();  
  13.                     json.append('[');  
  14.                     for(Video video : videos){  
  15.                         json.append('{');  
  16.                         json.append("id:").append(video.getId()).append(',');  
  17.                         json.append("title:/"").append(video.getTitle()).append("/",");  
  18.                         json.append("timelength:").append(video.getTimelength());  
  19.                         json.append('}');  
  20.                         json.append(',');  
  21.                     }  
  22.                     json.deleteCharAt(json.length()-1);  
  23.                     json.append(']');  
  24.                      
  25.                     request.setAttribute("json", json);  
  26.                     return mapping.findForward("json");  
  27.                      
  28.                 }else{             
  29.                     request.setAttribute("videos", videos);  
  30.                     return mapping.findForward("video");  
  31.                 }  
  32. }  


            
        ** Android 客户端解析获取的 JSON 数据
            Service :
              
  1. public static List<VideoMessage> getLastVideosFromJSON() throws Throwable {  
  2.                     String path = "http://10.4.74.20:8080/videoweb/video/list.do?format=json";  
  3.                     URL url = new URL(path);  
  4.                      
  5.                     HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  6.                     conn.setConnectTimeout(5 * 1000);  
  7.                     conn.setRequestMethod("GET");  
  8.                      
  9.                     InputStream is = conn.getInputStream();  
  10.                      
  11.                     // 从输入流中解析出 JSON 的字符串格式数据  
  12.                     byte[] bytes = ReadeStreamUtil.readStreamTobyteArr(is);  
  13.                     String jsonStr = new String(bytes, "UTF-8");  
  14.                      
  15.                     // JSON 接收的参数必须是 数组格式的 JSON 字符串数据,例如 "[{name:'XXX',age:'21'},{name:'AAA',age:'222'},{},{}]"  
  16.                     JSONArray jsonArray = new JSONArray(jsonStr);  
  17.                      
  18.                     List<VideoMessage> videos = new ArrayList<VideoMessage>();  
  19.                     for(int i=0; i<jsonArray.length(); i++) {  
  20.                         JSONObject jsonObject = jsonArray.getJSONObject(i);  
  21.                         String title = jsonObject.getString("title");  
  22.                         Integer timelength = Integer.parseInt(jsonObject.getString("timelength"));  
  23.                         Integer id = Integer.parseInt(jsonObject.getString("id"));  
  24.                          
  25.                         VideoMessage vs = new VideoMessage();  
  26.                         vs.setId(id);  
  27.                         vs.setTimeLength(timelength);  
  28.                         vs.setTitle(title);  
  29.                          
  30.                         videos.add(vs);  
  31.                     }  
  32.                      
  33.                     return videos;  
  34. }  

                
        ** Utils
           
  1. public class ReadeStreamUtil {  
  2.                 public static byte[] readStreamTobyteArr(InputStream is) throws Throwable {  
  3.                     ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  4.                      
  5.                     byte[] buffer = new byte[1024];  
  6.                     int len;  
  7.                      
  8.                     while((len = is.read(buffer)) != -1 ) {  
  9.                         bos.write(buffer, 0, len);  
  10.                     }  
  11.                      
  12.                     is.close();  
  13.                     bos.close();  
  14.                      
  15.                     return bos.toByteArray();  
  16.                 }  
  17. }  

            
            Main Activity:
                
  1. public void onCreate(Bundle savedInstanceState) {  
  2.                         super.onCreate(savedInstanceState);  
  3.                         setContentView(R.layout.main);  
  4.                         List<VideoMessage> vms = null;  
  5.                         try {  
  6.                                // XML 格式  
  7.                             //vms = VideoService.getLastVideos();  
  8.                               // JSON 格式  
  9.                             vms = VideoService.getLastVideosFromJSON();  
  10.                         } catch (Throwable e) {  
  11.                             e.printStackTrace();  
  12.                             Log.e(TAG, e.toString());  
  13.                             Toast.makeText(this, R.string.error, Toast.LENGTH_LONG);  
  14.                         }  
  15.                         listView = (ListView) findViewById(R.id.listView);  
  16.                          
  17.                          List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();  
  18.                          for (VideoMessage vm : vms) {  
  19.                             Map<String, Object> item = new HashMap<String, Object>();  
  20.                             item.put("title", vm.getTitle());  
  21.                             item.put("timelength", vm.getTimeLength());  
  22.                             data.add(item);  
  23.                         }  
  24.                         ListAdapter adapter = new SimpleAdapter(this, data, R.layout.item,  
  25.                                 new String[]{"title""timelength"}, new int[]{R.id.title, R.id.timelength});  
  26.                          
  27.                         listView.setAdapter(adapter);  
  28. }  

                    
    10. 将数据以 GET 方式提交到网络上的 Web 应用。
         
        ** 布局[略]
        
        ** Service
           
  1. public class VideoService {  
  2.                 /** 
  3.                  * 保存视频资讯(向服务器端发送请求实现保存) 
  4.                  */  
  5.                 public static boolean save(String name, String timelength) throws Exception {  
  6.                     String path = "http://10.4.74.20:8080/myvideoweb/video/manage.do";  
  7.                     Map<String, String> params = new HashMap<String, String>();  
  8.                     params.put("method""save");  
  9.                     params.put("timelength", timelength);  
  10.                     params.put("name", name);  
  11.                     return sendGetRequest(path, params, "UTF-8");  
  12.                 }  
  13.              
  14.                 /** 
  15.                  * 发出一个 可带参数的 GET 请求。 
  16.                  * @param params 参数键值 
  17.                  */  
  18.                 private static boolean sendGetRequest(String path, Map<String, String> params, String encoding) throws Exception {  
  19.                     StringBuilder pathWithParams = new StringBuilder(path);  
  20.                      
  21.                     /* 组装参数 ?method=save,name=sss,timelength=20 */  
  22.                     pathWithParams.append("?");  
  23.                     for (Map.Entry<String, String> param : params.entrySet()) {  
  24.                         pathWithParams.append(param.getKey()).append("=")  
  25.                                 /* 应该要对参数进行 URL 编码, 避免中文乱码问题 */  
  26.                              .append(URLEncoder.encode(param.getValue(),encoding))  
  27.                              .append("&");  
  28.                     }  
  29.                      
  30.                     // 去掉后缀的多余的  '&'符号  
  31.                     if(pathWithParams.indexOf("&") != -1) {  
  32.                         pathWithParams.deleteCharAt(pathWithParams.lastIndexOf("&"));  
  33.                     }  
  34.                      
  35.                     // 发送请求  
  36.                     URL url = new URL(pathWithParams.toString());  
  37.                     HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  38.                     conn.setConnectTimeout(5*1000);  
  39.                     conn.setRequestMethod("GET");  
  40.                      
  41.                     // 响应码为 200 表示响应成功  
  42.                     if(conn.getResponseCode() == 200) {  
  43.                         return true;  
  44.                     }  
  45.                      
  46.                     return false;  
  47.                 }  
  48. }  

            
        ** Activity
           
  1. public void onCreate(Bundle savedInstanceState) {  
  2.                 super.onCreate(savedInstanceState);  
  3.                 setContentView(R.layout.main);  
  4.                 timelengthText = (EditText) findViewById(R.id.timelength);  
  5.                 nameText = (EditText) findViewById(R.id.name);  
  6.                 button = (Button) findViewById(R.id.button);  
  7.                  
  8.                 // 为 button 添加点击事件  
  9.                 button.setOnClickListener(new View.OnClickListener() {  
  10.                     @Override  
  11.                     public void onClick(View v) {  
  12.                         String name = nameText.getText().toString();  
  13.                         String timelength = timelengthText.getText().toString();  
  14.                         try {  
  15.                             // 调用 Service 方法,向服务器发送数据  
  16.                             boolean status = VideoService.save(name, timelength);  
  17.                             if(status) {  
  18.                                 Toast.makeText(MainActivity.this, R.string.success, Toast.LENGTH_LONG).show();  
  19.                             } else {  
  20.                                 Toast.makeText(MainActivity.this, R.string.error, Toast.LENGTH_LONG).show();  
  21.                             }  
  22.                         } catch (Exception e) {  
  23.                             e.printStackTrace();  
  24.                         }  
  25.                     }  
  26.                 });  
  27.          
  28. }  

            
    11. 将数据以 post 方式提交到网络上的 Web 应用。
        用 HTTP 协议,将 Android 的数据以 POST 的方式提交到服务器保存。

        1. 观察浏览器 POST 方式提交数据时的 HTTP 协议内容:
            /* 以下为请求头 */
            POST /videoweb/video/manage.do HTTP/1.1    (: 请求方式(POST GET) 请求的路径 所使用的 HTTP 协议版本 )
            (:此处无空行 -- 浏览器所能接受的数据类型,最后面的 */* 表示任意)
            Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* 
            Referer: http://localhost:8080/videoweb/   (: 请求来源的 URl -- 比如,用户通过点击百度搜索结果的链接进入我的网站,我想统计,那么就可以使用这个数据)
            Accept-Language: zh-cn,en-us;q=0.5         (: 浏览器所接收的语言)
            Content-Type: application/x-www-form-urlencoded  (: 实体数据内容类型,x-www-form-urlencoded 为表单默认数据类型,是经过 URL 编码后的数据)
            Accept-Encoding: gzip, deflate      (: 表示浏览器可接受的数据类型)
            (:此处无空行 -- 用于表示当前使用的浏览器和版本,可以在串中查找 MSIE 6.0 来判断浏览器是否是 IE 6.0)
            User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; staticlogin:product=cboxf2010&act=login&info=ZmlsZW5hbWU9vfDJvbTKsNQyMDEwxaO98sbsvaKw5i5leGUmbWFjPUQ2OTUzRkRBOUUxNzQyQkNBQUM4QjQ3MDYxMTZDRjdEJnBhc3Nwb3J0PSZ2ZXJzaW9uPTIwMTAuNi4zLjYuMiZjcmFzaHR5cGU9MQ==&verify=7dda578e3701edc6e428f5b6a6d955e2)
            Host: 192.168.1.136:8080         (: 来源 IP)
            Content-Length: 49              (: 实体数据的内容长度)
            Connection: Keep-Alive
            Cache-Control: no-cache
            Cookie: JSESSIONID=13360465242B5FA4827B2B19CAB4F673    (: 如果浏览器支持 Cookie 的话,会带有这个值。JSESSIONID 为服务器会话跟踪的一种机制)
            (此处一定为空行)
            /* 以下为实体数据 */
            method=save&name=%E6%82%A8%E5%A5%BD&timelength=23
            
            
            Post方式提交, HTTP协议所必须的头字段有两个:
                 Content-Type: application/x-www-form-urlencoded (: 实体数据内容类型,x-www-form-urlencoded 为表单默认数据类型,是经过 URL 编码后的数据)
                 Content-Length: 49              (: 实体数据的内容长度)
                 
        
        2.  在 客户端手动 POST 提交数据
            Service:
             
  1. /** 
  2.                * 发出一个POST请求 
  3.                * @param path 请求的路径,不带参数 
  4.                * @param params 参数 
  5.                * @return 
  6.                * @throws Exception 
  7.                */  
  8.               private static boolean sendPostRequest(String path, Map<String, String> params, String encoding) throws Exception{  
  9.                    
  10.                   // 组装参数,其格式应该为: method=save&name=liming&timelength=78  
  11.                   StringBuilder sb = new StringBuilder("");  
  12.                   if(params!=null && !params.isEmpty()){  
  13.                       for(Map.Entry<String, String> entry : params.entrySet()){  
  14.                           sb.append(entry.getKey()).append('=')  
  15.                           // 防止中文乱码问题,对参数统一进行 URL 编码  
  16.                           .append(URLEncoder.encode(entry.getValue(), encoding)).append('&');  
  17.                       }  
  18.                        
  19.                       // 截取字符串后缀的多余的 "&"  
  20.                       if(sb.indexOf("&") != -1) {  
  21.                           sb.deleteCharAt(sb.length() - 1);  
  22.                       }  
  23.                        
  24.                   }  
  25.                    
  26.                   byte[] data = sb.toString().getBytes();//得到实体数据的二进制表示方式  
  27.                    
  28.                   URL url = new URL(path);  
  29.                   HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
  30.                    
  31.                   conn.setRequestMethod("POST");  
  32.                   conn.setConnectTimeout(5*1000);  
  33.                    
  34.                   //特别注意:通过 post 方式提交数据,必须要设置允许对外输出数据  
  35.                   conn.setDoOutput(true);  
  36.                    
  37.                   conn.setRequestProperty("Content-Type""application/x-www-form-urlencoded");  
  38.                   conn.setRequestProperty("Content-Length", String.valueOf(data.length));  
  39.                    
  40.                   OutputStream outStream = conn.getOutputStream();  
  41.                    
  42.                   outStream.write(data);  
  43.                   outStream.flush();  
  44.                   outStream.close();  
  45.                    
  46.                   // 相应码为 200 表示成功  
  47.                   if(conn.getResponseCode()==200){  
  48.                       return true;  
  49.                   }  
  50.                    
  51.                   return false;  

                
            布局:
                在界面输入文件的位置,点击上传
                将这个文件保存在服务器上。
                服务器就是一个普通的文件上传处理代码
            
            MainActivity:
                读取到界面的参数,调用 Service,传参
            
            乱码问题: POST 方式提交数据发送乱码,就添加编码转换过滤器
    
            Android 还集成了一个第三方开源项目: HttpClient。这个项目是 apache 组织开发的封装了 HTTP 相关操作的方法。    
            
           
  1. /** 
  2.              * 使用 HttpClient 完成数据 POST 方式提交到服务器, 不推荐使用这种方式。因为它是开源项目,里面会做很多本应用中没必要的封装,或多或少会影响效率。这对于手机平台,非常敏感。 
  3.              */  
  4.             private static boolean sendPostRequestHttpClient(String path, Map<String, String> params, String encoding) throws Exception{  
  5.                 // 组装参数对象  
  6.                 List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();  
  7.                 if(params!=null && !params.isEmpty()){  
  8.                     for(Map.Entry<String, String> entry : params.entrySet()){  
  9.                         BasicNameValuePair param = new BasicNameValuePair(entry.getKey(), entry.getValue());  
  10.                         paramPairs.add(param);  
  11.                     }  
  12.                 }  
  13.                  
  14.                 // 被 URL 编码后的实体数据对象  
  15.                 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramPairs, encoding);  
  16.                  
  17.                 HttpPost post = new HttpPost(path);  
  18.                 post.setEntity(entity);  
  19.                 DefaultHttpClient client = new DefaultHttpClient();//浏览器  
  20.                  
  21.                 // org.apache.http.HttpResponse  
  22.                 HttpResponse response = client.execute(post);     
  23.                  
  24.                 // 获得状态行 response.getStatusLine(),再获取状态码.(状态码在状态行里面 -- 也就是第一行)  
  25.                 if(response.getStatusLine().getStatusCode()==200){  
  26.                     return true;  
  27.                 }  
  28.                 return false;  
  29. }  


    13. 通过 HTTP 协议实现文件上传
                                                    /* 定义分隔线 */
        HTTP 的 ContentType=multipart/form-data;boundary=------------7da31c29608b2
        
        其实体数据是由分割线分隔开的参数
        在使用分隔线的时候有些需要注意:
            例如定义的分隔线为:---------------------7da31c29608b2
        那么,在实体数据中使用它就变成了:-----------------------7da31c29608b2
                    多两杠
                    需要特别注意
                    并且最后一条分割线的最后还多了两条杠 : -----------------------7da31c29608b2--
                    这就表示实体数据结束了
                    其格式具体为:
                        ---------分隔线(回车换行/r/n)
                        Content-Disposition: form-data; name="name"(回车换行/r/n)
                        (回车换行/r/n)
                        实体数据(回车换行/r/n)
                        ---------分隔线(回车换行/r/n)
                 
             
                 例:
                
                POST /videoweb/video/manage.do HTTP/1.1
            Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
            Referer: http://localhost:8080/videoweb/
            Accept-Language: zh-cn,en-us;q=0.5
            Content-Type: multipart/form-data; boundary=---------------------------7da31cf110e5e
            Accept-Encoding: gzip, deflate
            User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; staticlogin:product=cboxf2010&act=login&info=ZmlsZW5hbWU9vfDJvbTKsNQyMDEwxaO98sbsvaKw5i5leGUmbWFjPUQ2OTUzRkRBOUUxNzQyQkNBQUM4QjQ3MDYxMTZDRjdEJnBhc3Nwb3J0PSZ2ZXJzaW9uPTIwMTAuNi4zLjYuMiZjcmFzaHR5cGU9MQ==&verify=7dda578e3701edc6e428f5b6a6d955e2)
            Host: 192.168.1.136:8080
            Content-Length: 580
            Connection: Keep-Alive
            Cache-Control: no-cache
            Cookie: JSESSIONID=B175C70051A38FAFF324580E59EB4457
            
                -----------------------------7daab2e110e5e
            Content-Disposition: form-data; name="method" (注释:这里有一个回车换行 )
            (注释: 这里是一个空行,必须的,加上上一行末尾的回车换行,一共是两个回车换行)
            save
            -----------------------------7daab2e110e5e
            Content-Disposition: form-data; name="name"
            
            aaa
            -----------------------------7daab2e110e5e
            Content-Disposition: form-data; name="timelength"
            
            33
            -----------------------------7daab2e110e5e              (注释:以下是文件路径)
            Content-Disposition: form-data; name="video"; filename="C:/Documents and Settings/Administrator/妗岄潰/鏂板缓 鏂囨湰鏂囨。.txt"
            Content-Type: image/pjpeg
            
            这是个测试上传的文本文件内容sssssss   (注释:这里上传了一个文本文件,这里是文本文件的内容,本身这里应该是二进制数据的)
            -----------------------------7da31cf110e5e--  (注释:实体数据结束,多出两条杠)
             
            
            具体实现:
                最好不再使用以前的 HttpURLConnection 了
            以前的方式为:
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                OutputStream outStream = conn.getOutputStream();        
                outStream.write(data);
            但这个类有 BUG :
                因为它内部有缓存功能,它会把上传的文件放在内存里面
                而一旦我们上传的文件超过了 1M 之后,就有内存溢出的危险。
            就只能使用最底层的的格式来拼凑 HTTP 协议内容
            
           上传文件时需要注意的问题:
               这个文件的大小是否超出了手机的存储空间大小?
               如果这个文件比较大,例如,大于1M,那么就需要一边读一边写。
           接下来比较麻烦的就是组装实体数据了
                【略】祥见 txt/基于Socket的HTTP协议向服务器上传文件/..

    14. 客户端向服务器发送 XML 数据
        * 以实体数据的方式发送给服务器,客户端
      
  1. public static void main(String[] args) throws Throwable {  
  2.             /* 请求路径 */  
  3.             String path = "http://192.168.1.10:8080/videoweb/video/manage.do?method=getXML";  
  4.             /* XML数据 */  
  5.             String xml = "<?xml version=/"1.0/" encoding=/"UTF-8/"?><persons><person id=/"23/"><name>中国</name><age>30</age>< /person></persons>";  
  6.             byte[] data = xml.getBytes("UTF-8");  
  7.              
  8.             URL url = new URL(path);  
  9.             HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
  10.              
  11.             /* 设置 POST 提交参数 */  
  12.             conn.setConnectTimeout(5 *1000);  
  13.             conn.setRequestMethod("POST");  
  14.             conn.setDoOutput(true);  
  15.             conn.setRequestProperty("Content-Type""text/xml; charset=UTF-8");  
  16.             conn.setRequestProperty("Content-Length", String.valueOf(data.length));  
  17.              
  18.             /* 链接到服务器的输出流 */  
  19.             OutputStream outStream = conn.getOutputStream();  
  20.             outStream.write(data);  
  21.             outStream.flush();  
  22.             outStream.close();  
  23.              
  24.             System.out.println(conn.getResponseCode());  
  25. }  

        
        
        服务器端接收请求
         
  1. public ActionForward getXML(ActionMapping mapping, ActionForm form,  
  2.           HttpServletRequest request, HttpServletResponse response)  
  3.           throws Exception {  
  4.               InputStream inStream = request.getInputStream();  
  5.               byte[] data = StreamTool.readInputStream(inStream);  
  6.               String xml = new String(data, "UTF-8");  
  7.               System.out.println(xml);  
  8.               return mapping.findForward("result");  
  9.           }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值