Android中的Post和Get方法:服务器端+客户端
2015-05-23 10:09
337 查看
Post和Get方法是客户端与服务器端之间的信息交互方法
首先我们配置服务器端,服务器端是用MyEclipse编辑的一个Web服务器,创建一个Web Project,在这个Web Project中添加3个Servlet:
第一个SynDataServlet:
第二个SynTxtDataServlet:
第三个UploadFileServlet:
注意web.xml中对Servlet的映射:
在WebRoot根目录下放一个file.jpg文件和一个txtFile.txt文件。
服务器端配置好以后,我们进行Android客户端开发,通过Post和Get方法向服务器端提交数据和得到数据:
因为客户端要访问网络,首先在清单文件AndroidManifest.xml中添加一个网络授权:
第二步,创建一个NetTool.java工具类:
第三步:自定义一个Student.java类:
第四步:在main.xml中对Activity的布局进行设置:
第五步:在Activity.java中完成最后一步:
这样就可以实现客户端与服务器端的数据交互
首先我们配置服务器端,服务器端是用MyEclipse编辑的一个Web服务器,创建一个Web Project,在这个Web Project中添加3个Servlet:
第一个SynDataServlet:
package com.tgb.lk.demo.appserver; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SynDataServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("---------get-------------"); // 处理中文乱码问题解决办法 String name = new String(request.getParameter("name").getBytes( "iso-8859-1"), "UTF-8"); String age = request.getParameter("age"); String classes = new String(request.getParameter("classes").getBytes( "iso-8859-1"), "UTF-8"); System.out.println("-------" + name + age + classes + "--------"); response.setContentType("text/xml; charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("GET method "); out.print("name=" + name + ",age=" + age + ",classes=" + classes); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("---------post-------------"); String name = new String(request.getParameter("name").getBytes( "iso-8859-1"), "UTF-8"); String age = request.getParameter("age"); String classes = new String(request.getParameter("classes").getBytes( "iso-8859-1"), "UTF-8"); System.out.println("--------" + name + age + classes + "---------"); response.setContentType("text/xml; charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("POST method"); out.print("name=" + name + ",age=" + age + ",classes=" + classes); out.flush(); out.close(); } }
第二个SynTxtDataServlet:
package com.tgb.lk.demo.appserver; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SynTxtDataServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BufferedReader in = new BufferedReader(new InputStreamReader(request .getInputStream(), "UTF-8")); // 数据 String retData = null; String responseData = ""; while ((retData = in.readLine()) != null) { responseData += retData; } in.close(); response.setContentType("text/xml; charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("POST method"); out.print(responseData); out.flush(); out.close(); } }
第三个UploadFileServlet:
package com.tgb.lk.demo.appserver; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileUpload; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.servlet.ServletRequestContext; public class UploadFileServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置request编码,主要是为了处理普通输入框中的中文问题 request.setCharacterEncoding("gbk"); // 这里对request进行封装,RequestContext提供了对request多个访问方法 org.apache.commons.fileupload.RequestContext requestContext = new ServletRequestContext( request); // 判断表单是否是Multipart类型的。这里可以直接对request进行判断,不过已经以前的用法了 if (FileUpload.isMultipartContent(requestContext)) { DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置文件的缓存路径 factory.setRepository(new File("d:/tmp/")); File dir = new File("d:\\download\\"); if (!dir.exists()) { dir.mkdirs(); } // System.out.print("已经生成临时文件"); ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件大小的上限,-1表示无上限 upload.setSizeMax(100000 * 1024 * 1024); List items = new ArrayList(); try { // 上传文件,并解析出所有的表单字段,包括普通字段和文件字段 items = upload.parseRequest(request); } catch (FileUploadException e1) { System.out.println("文件上传发生错误" + e1.getMessage()); } // 下面对每个字段进行处理,分普通字段和文件字段 Iterator it = items.iterator(); while (it.hasNext()) { DiskFileItem fileItem = (DiskFileItem) it.next(); // 如果是普通字段 if (fileItem.isFormField()) { System.out.println(fileItem.getFieldName() + " " + fileItem.getName() + " " + new String(fileItem.getString().getBytes( "iso8859-1"), "gbk")); } else { System.out.println(fileItem.getFieldName() + " " + fileItem.getName() + " " + fileItem.isInMemory() + " " + fileItem.getContentType() + " " + fileItem.getSize()); // 保存文件,其实就是把缓存里的数据写到目标路径下 if (fileItem.getName() != null && fileItem.getSize() != 0) { File fullFile = new File(fileItem.getName()); File newFile = new File("d:\\download\\" + fullFile.getName()); try { fileItem.write(newFile); } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("文件没有选择 或 文件内容为空"); } } } } } }
注意web.xml中对Servlet的映射:
<servlet-mapping> <servlet-name>SynDataServlet</servlet-name> <url-pattern>/servlet/SynDataServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SynTxtDataServlet</servlet-name> <url-pattern>/servlet/SynTxtDataServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>UploadFileServlet</servlet-name> <url-pattern>/servlet/UploadFileServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
在WebRoot根目录下放一个file.jpg文件和一个txtFile.txt文件。
服务器端配置好以后,我们进行Android客户端开发,通过Post和Get方法向服务器端提交数据和得到数据:
因为客户端要访问网络,首先在清单文件AndroidManifest.xml中添加一个网络授权:
<uses-permission android:name="android.permission.INTERNET" />
第二步,创建一个NetTool.java工具类:
package com.tgb.lk.demo.util; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import android.os.Environment; /** * NetTool:封装一个类搞定90%安卓客户端与服务器端交互 * * @author 李坤 五期信息技术提高班 */ public class NetTool { private static final int TIMEOUT = 10000;// 10秒 /** * 传送文本,例如Json,xml等 */ public static String sendTxt(String urlPath, String txt, String encoding) throws Exception { byte[] sendData = txt.getBytes(); URL url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(TIMEOUT); // 如果通过post提交数据,必须设置允许对外输出数据 conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "text/xml"); conn.setRequestProperty("Charset", encoding); conn.setRequestProperty("Content-Length", String .valueOf(sendData.length)); OutputStream outStream = conn.getOutputStream(); outStream.write(sendData); outStream.flush(); outStream.close(); if (conn.getResponseCode() == 200) { // 获得服务器响应的数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn .getInputStream(), encoding)); // 数据 String retData = null; String responseData = ""; while ((retData = in.readLine()) != null) { responseData += retData; } in.close(); return responseData; } return "sendText error!"; } /** * 上传文件 */ public static String sendFile(String urlPath, String filePath, String newName) throws Exception { String end = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; URL url = new URL(urlPath); HttpURLConnection con = (HttpURLConnection) url.openConnection(); /* 允许Input、Output,不使用Cache */ con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); /* 设置传送的method=POST */ con.setRequestMethod("POST"); /* setRequestProperty */ con.setRequestProperty("Connection", "Keep-Alive"); con.setRequestProperty("Charset", "UTF-8"); con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); /* 设置DataOutputStream */ DataOutputStream ds = new DataOutputStream(con.getOutputStream()); ds.writeBytes(twoHyphens + boundary + end); ds.writeBytes("Content-Disposition: form-data; " + "name=\"file1\";filename=\"" + newName + "\"" + end); ds.writeBytes(end); /* 取得文件的FileInputStream */ FileInputStream fStream = new FileInputStream(filePath); /* 设置每次写入1024bytes */ int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int length = -1; /* 从文件读取数据至缓冲区 */ while ((length = fStream.read(buffer)) != -1) { /* 将资料写入DataOutputStream中 */ ds.write(buffer, 0, length); } ds.writeBytes(end); ds.writeBytes(twoHyphens + boundary + twoHyphens + end); /* close streams */ fStream.close(); ds.flush(); /* 取得Response内容 */ InputStream is = con.getInputStream(); int ch; StringBuffer b = new StringBuffer(); while ((ch = is.read()) != -1) { b.append((char) ch); } /* 关闭DataOutputStream */ ds.close(); return b.toString(); } /** * 通过get方式提交参数给服务器 */ public static String sendGetRequest(String urlPath, Map<String, String> params, String encoding) throws Exception { // 使用StringBuilder对象 StringBuilder sb = new StringBuilder(urlPath); sb.append('?'); // 迭代Map for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(entry.getKey()).append('=').append( URLEncoder.encode(entry.getValue(), encoding)).append('&'); } sb.deleteCharAt(sb.length() - 1); // 打开链接 URL url = new URL(sb.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-Type", "text/xml"); conn.setRequestProperty("Charset", encoding); conn.setConnectTimeout(TIMEOUT); // 如果请求响应码是200,则表示成功 if (conn.getResponseCode() == 200) { // 获得服务器响应的数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn .getInputStream(), encoding)); // 数据 String retData = null; String responseData = ""; while ((retData = in.readLine()) != null) { responseData += retData; } in.close(); return responseData; } return "sendGetRequest error!"; } /** * 通过Post方式提交参数给服务器,也可以用来传送json或xml文件 */ public static String sendPostRequest(String urlPath, Map<String, String> params, String encoding) throws Exception { StringBuilder sb = new StringBuilder(); // 如果参数不为空 if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { // Post方式提交参数的话,不能省略内容类型与长度 sb.append(entry.getKey()).append('=').append( URLEncoder.encode(entry.getValue(), encoding)).append( '&'); } sb.deleteCharAt(sb.length() - 1); } // 得到实体的二进制数据 byte[] entitydata = sb.toString().getBytes(); URL url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(TIMEOUT); // 如果通过post提交数据,必须设置允许对外输出数据 conn.setDoOutput(true); // 这里只设置内容类型与内容长度的头字段 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // conn.setRequestProperty("Content-Type", "text/xml"); conn.setRequestProperty("Charset", encoding); conn.setRequestProperty("Content-Length", String .valueOf(entitydata.length)); OutputStream outStream = conn.getOutputStream(); // 把实体数据写入是输出流 outStream.write(entitydata); // 内存中的数据刷入 outStream.flush(); outStream.close(); // 如果请求响应码是200,则表示成功 if (conn.getResponseCode() == 200) { // 获得服务器响应的数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn .getInputStream(), encoding)); // 数据 String retData = null; String responseData = ""; while ((retData = in.readLine()) != null) { responseData += retData; } in.close(); return responseData; } return "sendText error!"; } /** * 在遇上HTTPS安全模式或者操作cookie的时候使用HTTPclient会方便很多 使用HTTPClient(开源项目)向服务器提交参数 */ public static String sendHttpClientPost(String urlPath, Map<String, String> params, String encoding) throws Exception { // 需要把参数放到NameValuePair List<NameValuePair> paramPairs = new ArrayList<NameValuePair>(); if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { paramPairs.add(new BasicNameValuePair(entry.getKey(), entry .getValue())); } } // 对请求参数进行编码,得到实体数据 UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, encoding); // 构造一个请求路径 HttpPost post = new HttpPost(urlPath); // 设置请求实体 post.setEntity(entitydata); // 浏览器对象 DefaultHttpClient client = new DefaultHttpClient(); // 执行post请求 HttpResponse response = client.execute(post); // 从状态行中获取状态码,判断响应码是否符合要求 if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); InputStream inputStream = entity.getContent(); InputStreamReader inputStreamReader = new InputStreamReader( inputStream, encoding); BufferedReader reader = new BufferedReader(inputStreamReader);// 读字符串用的。 String s; String responseData = ""; while (((s = reader.readLine()) != null)) { responseData += s; } reader.close();// 关闭输入流 return responseData; } return "sendHttpClientPost error!"; } /** * 根据URL直接读文件内容,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容 */ public static String readTxtFile(String urlStr, String encoding) throws Exception { StringBuffer sb = new StringBuffer(); String line = null; BufferedReader buffer = null; try { // 创建一个URL对象 URL url = new URL(urlStr); // 创建一个Http连接 HttpURLConnection urlConn = (HttpURLConnection) url .openConnection(); // 使用IO流读取数据 buffer = new BufferedReader(new InputStreamReader(urlConn .getInputStream(), encoding)); while ((line = buffer.readLine()) != null) { sb.append(line); } } catch (Exception e) { throw e; } finally { try { buffer.close(); } catch (Exception e) { e.printStackTrace(); } } return sb.toString(); } /** * 该函数返回整形 -1:代表下载文件出错 0:代表下载文件成功 1:代表文件已经存在 */ public static int downloadFile(String urlStr, String path, String fileName) throws Exception { InputStream inputStream = null; try { inputStream = getInputStreamFromUrl(urlStr); File resultFile = write2SDFromInput(path, fileName, inputStream); if (resultFile == null) { return -1; } } catch (Exception e) { return -1; } finally { try { inputStream.close(); } catch (Exception e) { throw e; } } return 0; } /** * 根据URL得到输入流 * * @param urlStr * @return * @throws MalformedURLException * @throws IOException */ public static InputStream getInputStreamFromUrl(String urlStr) throws MalformedURLException, IOException { URL url = new URL(urlStr); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConn.getInputStream(); return inputStream; } /** * 将一个InputStream里面的数据写入到SD卡中 */ private static File write2SDFromInput(String directory, String fileName, InputStream input) { File file = null; String SDPATH = Environment.getExternalStorageDirectory().toString(); FileOutputStream output = null; File dir = new File(SDPATH + directory); if (!dir.exists()) { dir.mkdir(); } try { file = new File(dir + File.separator + fileName); file.createNewFile(); output = new FileOutputStream(file); byte buffer[] = new byte[1024]; while ((input.read(buffer)) != -1) { output.write(buffer); } output.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { output.close(); } catch (IOException e) { e.printStackTrace(); } } return file; } }
第三步:自定义一个Student.java类:
package com.tgb.lk.demo.util; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import android.os.Environment; /** * NetTool:封装一个类搞定90%安卓客户端与服务器端交互 * * @author 李坤 五期信息技术提高班 */ public class NetTool { private static final int TIMEOUT = 10000;// 10秒 /** * 传送文本,例如Json,xml等 */ public static String sendTxt(String urlPath, String txt, String encoding) throws Exception { byte[] sendData = txt.getBytes(); URL url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(TIMEOUT); // 如果通过post提交数据,必须设置允许对外输出数据 conn.setDoOutput(true); conn.setRequestProperty("Content-Type", "text/xml"); conn.setRequestProperty("Charset", encoding); conn.setRequestProperty("Content-Length", String .valueOf(sendData.length)); OutputStream outStream = conn.getOutputStream(); outStream.write(sendData); outStream.flush(); outStream.close(); if (conn.getResponseCode() == 200) { // 获得服务器响应的数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn .getInputStream(), encoding)); // 数据 String retData = null; String responseData = ""; while ((retData = in.readLine()) != null) { responseData += retData; } in.close(); return responseData; } return "sendText error!"; } /** * 上传文件 */ public static String sendFile(String urlPath, String filePath, String newName) throws Exception { String end = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; URL url = new URL(urlPath); HttpURLConnection con = (HttpURLConnection) url.openConnection(); /* 允许Input、Output,不使用Cache */ con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); /* 设置传送的method=POST */ con.setRequestMethod("POST"); /* setRequestProperty */ con.setRequestProperty("Connection", "Keep-Alive"); con.setRequestProperty("Charset", "UTF-8"); con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); /* 设置DataOutputStream */ DataOutputStream ds = new DataOutputStream(con.getOutputStream()); ds.writeBytes(twoHyphens + boundary + end); ds.writeBytes("Content-Disposition: form-data; " + "name=\"file1\";filename=\"" + newName + "\"" + end); ds.writeBytes(end); /* 取得文件的FileInputStream */ FileInputStream fStream = new FileInputStream(filePath); /* 设置每次写入1024bytes */ int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int length = -1; /* 从文件读取数据至缓冲区 */ while ((length = fStream.read(buffer)) != -1) { /* 将资料写入DataOutputStream中 */ ds.write(buffer, 0, length); } ds.writeBytes(end); ds.writeBytes(twoHyphens + boundary + twoHyphens + end); /* close streams */ fStream.close(); ds.flush(); /* 取得Response内容 */ InputStream is = con.getInputStream(); int ch; StringBuffer b = new StringBuffer(); while ((ch = is.read()) != -1) { b.append((char) ch); } /* 关闭DataOutputStream */ ds.close(); return b.toString(); } /** * 通过get方式提交参数给服务器 */ public static String sendGetRequest(String urlPath, Map<String, String> params, String encoding) throws Exception { // 使用StringBuilder对象 StringBuilder sb = new StringBuilder(urlPath); sb.append('?'); // 迭代Map for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(entry.getKey()).append('=').append( URLEncoder.encode(entry.getValue(), encoding)).append('&'); } sb.deleteCharAt(sb.length() - 1); // 打开链接 URL url = new URL(sb.toString()); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("Content-Type", "text/xml"); conn.setRequestProperty("Charset", encoding); conn.setConnectTimeout(TIMEOUT); // 如果请求响应码是200,则表示成功 if (conn.getResponseCode() == 200) { // 获得服务器响应的数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn .getInputStream(), encoding)); // 数据 String retData = null; String responseData = ""; while ((retData = in.readLine()) != null) { responseData += retData; } in.close(); return responseData; } return "sendGetRequest error!"; } /** * 通过Post方式提交参数给服务器,也可以用来传送json或xml文件 */ public static String sendPostRequest(String urlPath, Map<String, String> params, String encoding) throws Exception { StringBuilder sb = new StringBuilder(); // 如果参数不为空 if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { // Post方式提交参数的话,不能省略内容类型与长度 sb.append(entry.getKey()).append('=').append( URLEncoder.encode(entry.getValue(), encoding)).append( '&'); } sb.deleteCharAt(sb.length() - 1); } // 得到实体的二进制数据 byte[] entitydata = sb.toString().getBytes(); URL url = new URL(urlPath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(TIMEOUT); // 如果通过post提交数据,必须设置允许对外输出数据 conn.setDoOutput(true); // 这里只设置内容类型与内容长度的头字段 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // conn.setRequestProperty("Content-Type", "text/xml"); conn.setRequestProperty("Charset", encoding); conn.setRequestProperty("Content-Length", String .valueOf(entitydata.length)); OutputStream outStream = conn.getOutputStream(); // 把实体数据写入是输出流 outStream.write(entitydata); // 内存中的数据刷入 outStream.flush(); outStream.close(); // 如果请求响应码是200,则表示成功 if (conn.getResponseCode() == 200) { // 获得服务器响应的数据 BufferedReader in = new BufferedReader(new InputStreamReader(conn .getInputStream(), encoding)); // 数据 String retData = null; String responseData = ""; while ((retData = in.readLine()) != null) { responseData += retData; } in.close(); return responseData; } return "sendText error!"; } /** * 在遇上HTTPS安全模式或者操作cookie的时候使用HTTPclient会方便很多 使用HTTPClient(开源项目)向服务器提交参数 */ public static String sendHttpClientPost(String urlPath, Map<String, String> params, String encoding) throws Exception { // 需要把参数放到NameValuePair List<NameValuePair> paramPairs = new ArrayList<NameValuePair>(); if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { paramPairs.add(new BasicNameValuePair(entry.getKey(), entry .getValue())); } } // 对请求参数进行编码,得到实体数据 UrlEncodedFormEntity entitydata = new UrlEncodedFormEntity(paramPairs, encoding); // 构造一个请求路径 HttpPost post = new HttpPost(urlPath); // 设置请求实体 post.setEntity(entitydata); // 浏览器对象 DefaultHttpClient client = new DefaultHttpClient(); // 执行post请求 HttpResponse response = client.execute(post); // 从状态行中获取状态码,判断响应码是否符合要求 if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); InputStream inputStream = entity.getContent(); InputStreamReader inputStreamReader = new InputStreamReader( inputStream, encoding); BufferedReader reader = new BufferedReader(inputStreamReader);// 读字符串用的。 String s; String responseData = ""; while (((s = reader.readLine()) != null)) { responseData += s; } reader.close();// 关闭输入流 return responseData; } return "sendHttpClientPost error!"; } /** * 根据URL直接读文件内容,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容 */ public static String readTxtFile(String urlStr, String encoding) throws Exception { StringBuffer sb = new StringBuffer(); String line = null; BufferedReader buffer = null; try { // 创建一个URL对象 URL url = new URL(urlStr); // 创建一个Http连接 HttpURLConnection urlConn = (HttpURLConnection) url .openConnection(); // 使用IO流读取数据 buffer = new BufferedReader(new InputStreamReader(urlConn .getInputStream(), encoding)); while ((line = buffer.readLine()) != null) { sb.append(line); } } catch (Exception e) { throw e; } finally { try { buffer.close(); } catch (Exception e) { e.printStackTrace(); } } return sb.toString(); } /** * 该函数返回整形 -1:代表下载文件出错 0:代表下载文件成功 1:代表文件已经存在 */ public static int downloadFile(String urlStr, String path, String fileName) throws Exception { InputStream inputStream = null; try { inputStream = getInputStreamFromUrl(urlStr); File resultFile = write2SDFromInput(path, fileName, inputStream); if (resultFile == null) { return -1; } } catch (Exception e) { return -1; } finally { try { inputStream.close(); } catch (Exception e) { throw e; } } return 0; } /** * 根据URL得到输入流 * * @param urlStr * @return * @throws MalformedURLException * @throws IOException */ public static InputStream getInputStreamFromUrl(String urlStr) throws MalformedURLException, IOException { URL url = new URL(urlStr); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConn.getInputStream(); return inputStream; } /** * 将一个InputStream里面的数据写入到SD卡中 */ private static File write2SDFromInput(String directory, String fileName, InputStream input) { File file = null; String SDPATH = Environment.getExternalStorageDirectory().toString(); FileOutputStream output = null; File dir = new File(SDPATH + directory); if (!dir.exists()) { dir.mkdir(); } try { file = new File(dir + File.separator + fileName); file.createNewFile(); output = new FileOutputStream(file); byte buffer[] = new byte[1024]; while ((input.read(buffer)) != -1) { output.write(buffer); } output.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { output.close(); } catch (IOException e) { e.printStackTrace(); } } return file; } }
第四步:在main.xml中对Activity的布局进行设置:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/tvData" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="数据" /> <Button android:id="@+id/btnTxt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="与服务器端交互Json数据" /> <Button android:id="@+id/btnGet" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Get方式与服务器端交互数据" /> <Button android:id="@+id/btnPost" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Post方式与服务器端交互数据" /> <Button android:id="@+id/btnHttpClient" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="HttpClient方式与服务器端交互数据" /> <Button android:id="@+id/btnUploadFile" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="上传文件到服务器端" /> <Button android:id="@+id/btnDownloadFile" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="从服务器端下载文件" /> <Button android:id="@+id/btnReadTxtFile" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="从服务器端读取文本文件" /> </LinearLayout>
第五步:在Activity.java中完成最后一步:
package com.tgb.lk.demo.appclient; import java.util.HashMap; import java.util.Map; import com.google.gson.Gson; import com.tgb.lk.demo.model.Student; import com.tgb.lk.demo.util.NetTool; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class AppClientActivity extends Activity { private TextView tvData = null; private Button btnTxt = null; private Button btnGet = null; private Button btnPost = null; private Button btnHttpClient = null; private Button btnUploadFile = null; private Button btnReadTxtFile = null; private Button btnDownloadFile = null; private ProgressDialog dialog; //需要将下面的IP改为服务器端IP private String txtUrl = "http://192.168.56.1:8080/ServiceGetAndPost/servlet/SynTxtDataServlet"; private String url = "http://192.168.56.1:8080/ServiceGetAndPost/servlet/SynDataServlet"; private String uploadUrl = "http://192.168.56.1:8080/ServiceGetAndPost/servlet/UploadFileServlet"; private String fileUrl = "http://192.168.56.1:8080/ServiceGetAndPost/file.jpg"; private String txtFileUrl = "http://192.168.56.1:8080/ServiceGetAndPost/txtFile.txt"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tvData = (TextView) findViewById(R.id.tvData); btnTxt = (Button) findViewById(R.id.btnTxt); btnGet = (Button) findViewById(R.id.btnGet); btnPost = (Button) findViewById(R.id.btnPost); btnHttpClient = (Button) findViewById(R.id.btnHttpClient); btnUploadFile = (Button) findViewById(R.id.btnUploadFile); btnReadTxtFile = (Button) findViewById(R.id.btnReadTxtFile); btnDownloadFile = (Button) findViewById(R.id.btnDownloadFile); dialog=new ProgressDialog(this) ; dialog.setTitle("提示"); dialog.setMessage("正在下载,请稍后。。。"); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setCancelable(false); btnTxt.setOnClickListener(btnListener); btnGet.setOnClickListener(btnListener); btnPost.setOnClickListener(btnListener); btnHttpClient.setOnClickListener(btnListener); btnUploadFile.setOnClickListener(btnListener); btnReadTxtFile.setOnClickListener(btnListener); btnDownloadFile.setOnClickListener(btnListener); } OnClickListener btnListener = new OnClickListener() { String retStr = ""; @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnTxt: new MyTask1().execute(txtUrl); break; case R.id.btnGet: new MyTask2().execute(url); break; case R.id.btnPost: new MyTask3().execute(url); break; case R.id.btnHttpClient: new MyTask4().execute(url); break; case R.id.btnUploadFile: // 需要在sdcard中放一张image.jsp的图片,本例才能正确运行 new MyTask5().execute(uploadUrl); break; case R.id.btnReadTxtFile: new MyTask6().execute(txtFileUrl); break; case R.id.btnDownloadFile: new MyTask7().execute(fileUrl); break; default: break; } tvData.setText(retStr); } }; public class MyTask1 extends AsyncTask<String, Integer, String>{ @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub String result=null; Student student = new Student(); student.setId(1); student.setName("李坤"); student.setClasses("五期信息技术提高班"); Gson gson = new Gson(); String jsonTxt = gson.toJson(student); try { result = NetTool.sendTxt(arg0[0], jsonTxt,"UTF-8"); } catch (Exception e2) { e2.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); tvData.setText(result); Toast.makeText(AppClientActivity.this, "-->>"+result, 1).show(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.show(); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); dialog.setProgress(values[0]); } } public class MyTask2 extends AsyncTask<String, Integer, String>{ @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub String result=null; Map<String, String> map = new HashMap<String, String>(); map.put("name", "李坤"); map.put("age", "26"); map.put("classes", "五期信息技术提高班"); try { result = NetTool.sendGetRequest(arg0[0], map, "utf-8"); } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); tvData.setText(result); Toast.makeText(AppClientActivity.this, "-->>"+result, 1).show(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.show(); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); dialog.setProgress(values[0]); } } public class MyTask3 extends AsyncTask<String, Integer, String>{ @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub String result=null; Map<String, String> map2 = new HashMap<String, String>(); map2.put("name", "李坤"); map2.put("age", "26"); map2.put("classes", "五期信息技术提高班"); try { result = NetTool.sendPostRequest(arg0[0], map2, "utf-8"); } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); tvData.setText(result); Toast.makeText(AppClientActivity.this, "-->>"+result, 1).show(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.show(); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); dialog.setProgress(values[0]); } } public class MyTask4 extends AsyncTask<String, Integer, String>{ @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub String result=null; Map<String, String> map3 = new HashMap<String, String>(); map3.put("name", "李坤"); map3.put("age", "26"); map3.put("classes", "五期信息技术提高班"); try { result = NetTool.sendHttpClientPost(arg0[0], map3, "utf-8"); } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); tvData.setText(result); Toast.makeText(AppClientActivity.this, "-->>"+result, 1).show(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.show(); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); dialog.setProgress(values[0]); } } public class MyTask5 extends AsyncTask<String, Integer, String>{ @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub String result=null; try { result = NetTool.sendFile(arg0[0], "/sdcard/image.jpg", "image1.jpg"); } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); tvData.setText(result); Toast.makeText(AppClientActivity.this, "-->>"+result, 1).show(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.show(); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); dialog.setProgress(values[0]); } } public class MyTask6 extends AsyncTask<String, Integer, String>{ @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub String result=null; try { //本例中服务器端的文件类型是UTF-8 result = NetTool.readTxtFile(arg0[0], "UTF-8"); } catch (Exception e1) { e1.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); tvData.setText(result); Toast.makeText(AppClientActivity.this, "-->>"+result, 1).show(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.show(); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); dialog.setProgress(values[0]); } } public class MyTask7 extends AsyncTask<String, Integer, String>{ @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub String result=null; try { NetTool.downloadFile(arg0[0], "/download", "newfile.jpg"); } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); dialog.dismiss(); tvData.setText(result); Toast.makeText(AppClientActivity.this, "-->>"+result, 1).show(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.show(); } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); dialog.setProgress(values[0]); } } }
这样就可以实现客户端与服务器端的数据交互
相关文章推荐
- Android中的Post和Get方法:服务器端+客户端
- android客户端从服务器端获取json数据并解析的实现代码get+post
- Android的httpclient的post方法获取服务器端的数据(服务器端是get方法)
- Android通过get,post方式客户端与服务器端交互实例(慕课网笔记)
- Android HTTP实例 使用GET方法和POST方法发送请求
- Android HTTP实例 使用GET方法和POST方法发送请求
- Android HTTP实例 使用GET方法和POST方法发送请求
- HTTP协议下Android web应用GET和POST请求方法的请求、响应、传参
- Android-HTTP实例——使用GET方法、POST方法发送请求(安卓4.0以下版本)
- android中用GET和POST的方法向服务器上传数据
- Android使用Httpclient网络请求,get,post方法
- Android HttpClient GET或者POST请求基本使用方法
- Android Get方法和POST方法发送请求
- 客户端与服务端Post报文构造请求及Http Post与Get请求方法
- Android HttpClient GET或者POST请求基本使用方法
- Android中使用OkHttp包处理HTTP的get和post请求的方法
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
- Android 初识网络之get/post方法演示
- Android 通过get和post方法访问网络
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)