紧接着上两篇关于文件流传递的demo,后来发现还是通过http的get请求,效果最好,可以很快的将服务器端的文件下载到客户端。代码如下所示:
首先我们写一个服务器端应用,它可以看成是一个servlet:
package download; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class A */ public class ServerServlet extends HttpServlet { public static int BUFFER_SIZE = 1024 * 1024; static Runtime get_runtime = Runtime.getRuntime(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { usedMemory(1); File file = new File("E:/toodou_work/test.csv"); BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); //实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。 ByteArrayOutputStream out = new ByteArrayOutputStream(BUFFER_SIZE); byte[] temp = new byte[BUFFER_SIZE]; int size = 0; //读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。 while ((size = in.read(temp)) != -1) { out.write(temp, 0, size); } usedMemory(2); in.close(); //Provides an output stream for sending binary data to the client. ServletOutputStream baos = response.getOutputStream(); out.writeTo(baos);// byte 数组输出流的全部内容写入到指定的输出流参数中,这与使用 out.write(buf, 0, count) 调用该输出流的 write 方法效果一样。 out.flush(); } public static void usedMemory(int i) { long l = get_runtime.totalMemory() - get_runtime.freeMemory(); long k = l / 1024; System.out.println(i + ": " + k + " K"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
客户端代码:
package download; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class SendGetRequest { static String sessionId = ""; static Runtime send_runtime = Runtime.getRuntime(); public static void main(String[] args) throws Exception { ServerServlet.usedMemory(3); URL url = new URL("http://localhost:8080/abc/ServerServlet"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 true。 connection.setDoOutput(true); // Read from the connection. Default is true. connection.setDoInput(true); // Set the post method. Default is GET connection.setRequestMethod("GET"); // URLConnection.setInstanceFollowRedirects是成员函数,仅作用于当前函数 connection.setInstanceFollowRedirects(false); // connection. Settings above must be set before connect! // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的 // 意思是正文是urlencoded编码过的form参数,下面我们可以看到我们对正文内容使用URLEncoder.encode // 进行编码 connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("ENCTYPE", "multipart/form-data"); // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成, // 要注意的是connection.getOutputStream会隐含的进行connect。 connection.connect(); /*//记录发送请求时间 Long sendTime = System.currentTimeMillis(); DataOutputStream out = new DataOutputStream(connection.getOutputStream()); // 要传的参数 String content = URLEncoder.encode("sendTime", "UTF-8") + "=" + URLEncoder.encode(sendTime.toString(), "UTF-8"); //读海量文件 StringBuilder postStrBuf = new StringBuilder(); for (int i = 0; i < 1; i++) { File file = new File("E:/toodou_work/yuliang.csv"); BufferedReader reader = null; String postStr = null; reader = new BufferedReader(new FileReader(file)); while ((postStr = reader.readLine()) != null) { postStrBuf.append(postStr); } } content = content + "&" + URLEncoder.encode("file", "UTF-8") + "=" + URLEncoder.encode(postStrBuf.toString(), "UTF-8"); // DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面 out.writeBytes(content); out.flush(); out.close(); // flush and close */ //记录发送请求时间 long start = System.currentTimeMillis(); //Get Session ID String key = ""; if (connection != null) { for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++) { if (key.equalsIgnoreCase("set-cookie")) { sessionId = connection.getHeaderField(key); sessionId = sessionId.substring(0, sessionId.indexOf(";")); } } } InputStream is = connection.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); FileOutputStream fos = new FileOutputStream(new File("e:/1111111.txt")); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] temp = new byte[ServerServlet.BUFFER_SIZE]; int size = 0; while ((size = bis.read(temp)) != -1) { bos.write(temp, 0, size); } ServerServlet.usedMemory(4); bos.flush();//刷新此缓冲的输出流。这迫使所有缓冲的输出字节被写出到底层输出流中。 bos.close(); bis.close(); // BufferedReader br = new BufferedReader(new InputStreamReader(is)); // // String str = null; // StringBuilder sb = new StringBuilder(); // // while ((str = br.readLine()) != null) { // System.out.println(str); // } //记录将从连接请求返回的数据写到文件完毕的时间 /*long end = System.currentTimeMillis(); System.out.println("cost time: " + (end - start) + " ms");*/ //关闭连接 connection.disconnect(); } }
您还没有登录,请您登录后再发表评论
服务器端,通常指的是运行在网络服务器上的软件应用程序,它负责处理来自客户端的请求,并向其返回响应。这些请求可能涉及数据存储、计算任务、业务逻辑执行等。服务器端程序可以由多种语言编写,如Java、Python、...
本示例探讨的是如何使用HTTPClient库在客户端发送XML报文到服务器端,且报文通过POST方法传递,并可能涉及加密处理,确保数据的安全性。 首先,HTTPClient是Apache提供的一款强大的Java HTTP客户端API,它允许...
通过测试,可以确保服务器端在实际部署后能够稳定、准确地处理来自客户端的请求。 总结来说,理解GET和POST请求的工作原理,以及如何处理中文乱码问题,对于开发和测试服务器端功能至关重要。这涉及到HTTP协议、...
在Android应用开发中,客户端与服务器端的交互是不可或缺的一部分,这使得用户能够获取和发送数据,实现功能如登录注册、数据同步等。本话题主要关注Android客户端与服务器端通过GET和POST方法进行数据传输的基本...
请求行是指客户端向服务器端发送的请求命令,例如GET cuishen.iteye./blog/242842 /1.1。请求头标是指客户端向服务器端发送的头标信息,例如Accept、Accept-Language、Accept-Encoding等。空行是指客户端向服务器端...
在Android客户端与Java服务器端的通信中,文件...总的来说,Android客户端向Java服务器端上传文件涉及到网络通信、文件处理、多线程以及服务器端的数据接收和存储。理解这些概念并正确实现它们是开发这类应用的关键。
服务器端通过监听特定的端口,等待客户端的连接请求,一旦连接建立,双方就可以通过发送和接收数据来实现文件的查询、上传和下载。 FTP是互联网上广泛使用的文件传输协议,它定义了两个进程之间如何交换文件。在这...
在Android应用开发中,客户端与服务器端的通信是不可或缺的一部分,它使得移动设备能够获取、发送数据,实现功能如登录注册、数据同步、文件上传下载等。本Demo着重展示了这一核心概念,通过实例来帮助开发者理解和...
在Android平台上进行网络编程,客户端与服务器端的交互是至关重要的。这个主题主要涉及的是如何通过URL方式获取网络数据,实现文件的下载、解压,以及文件的上传功能,同时涵盖了对SD卡文件的浏览。这里我们将深入...
服务器端接收到数据后,可以将其写入本地文件,还原成原始图片。为了提高效率,可以考虑使用QBuffer作为中间容器,以减少内存拷贝。 针对客户端关闭导致服务器端崩溃的问题,我们需要在服务器端添加异常处理机制。...
2. **请求与响应**:客户端(通常是Android应用)通过发送HTTP请求(GET、POST等)来向服务器端获取或者提交数据。服务器接收到请求后,处理数据并返回响应,响应中可能包含处理结果或需要返回的数据。 3. **JSON ...
通常,这会是一个POST请求,因为GET请求可能受到URL长度限制,不适用于大文件下载。 ```java public interface DownloadService { @POST("download") Call<ResponseBody> downloadFile(@Query("filename") String...
总结起来,这个任务涉及到VC客户端如何利用HTTP POST方法将文件上传到PHP服务器,以及服务器端如何接收并处理这些文件。在实际应用中,需要考虑安全性、错误处理和性能优化。理解这一过程对于开发涉及文件交互的Web...
这个例子主要涉及到了Ajax(异步JavaScript和XML)技术,用于实现客户端与服务器端的远程调用。Ajax允许网页不需重新加载整个页面的情况下更新部分网页内容,从而提升了用户体验。 首先,我们需要理解Ajax的工作...
例如,一个简单的网页加载过程就是客户端发送GET请求到服务器,服务器返回HTML内容。 三、数据交换格式 在客户端和服务器间传输的数据通常被编码为JSON或XML格式。JSON(JavaScript Object Notation)因其简洁性和...
这个Demo涵盖了从客户端到服务器端的基本数据发送和接收,以及验证过程。下面将详细解释这个Demo涉及到的知识点。 1. **Android网络请求库**: Android原生API进行网络操作较为繁琐,所以通常会使用第三方库,如`...
GET请求则将数据附加到URL上。 - **接收数据**:服务器响应的数据通常是JSON格式,Android客户端需要解析这些数据。使用`org.json`库,可以将JSON字符串转换为JSONObject或JSONArray,并提取所需信息。 2. **文件...
4. **文件上传机制**:文件上传通常涉及将文件分割成多个数据块,然后通过网络发送到服务器。服务器需要接收这些数据块,重组为原始文件,并保存到硬盘上。同时,需要处理错误检测和恢复,以确保文件完整无损。 5. ...
在这个例子中,`Configure`方法定义了路由,当客户端发送GET请求到根URL("/")时,服务器将返回"Hello World!"。 标签“webHttp”可能指的是Web API,这是一种构建RESTful服务的方法,用于使应用程序通过HTTP协议...
在Android客户端向Java服务器端上传文件的过程中,涉及到了多个关键的技术点和步骤,这包括了文件选择、HTTP请求、数据编码、服务器端处理等。以下将详细解释这些知识点。 1. **Android文件浏览器**:在Android应用...
相关推荐
服务器端,通常指的是运行在网络服务器上的软件应用程序,它负责处理来自客户端的请求,并向其返回响应。这些请求可能涉及数据存储、计算任务、业务逻辑执行等。服务器端程序可以由多种语言编写,如Java、Python、...
本示例探讨的是如何使用HTTPClient库在客户端发送XML报文到服务器端,且报文通过POST方法传递,并可能涉及加密处理,确保数据的安全性。 首先,HTTPClient是Apache提供的一款强大的Java HTTP客户端API,它允许...
通过测试,可以确保服务器端在实际部署后能够稳定、准确地处理来自客户端的请求。 总结来说,理解GET和POST请求的工作原理,以及如何处理中文乱码问题,对于开发和测试服务器端功能至关重要。这涉及到HTTP协议、...
在Android应用开发中,客户端与服务器端的交互是不可或缺的一部分,这使得用户能够获取和发送数据,实现功能如登录注册、数据同步等。本话题主要关注Android客户端与服务器端通过GET和POST方法进行数据传输的基本...
请求行是指客户端向服务器端发送的请求命令,例如GET cuishen.iteye./blog/242842 /1.1。请求头标是指客户端向服务器端发送的头标信息,例如Accept、Accept-Language、Accept-Encoding等。空行是指客户端向服务器端...
在Android客户端与Java服务器端的通信中,文件...总的来说,Android客户端向Java服务器端上传文件涉及到网络通信、文件处理、多线程以及服务器端的数据接收和存储。理解这些概念并正确实现它们是开发这类应用的关键。
服务器端通过监听特定的端口,等待客户端的连接请求,一旦连接建立,双方就可以通过发送和接收数据来实现文件的查询、上传和下载。 FTP是互联网上广泛使用的文件传输协议,它定义了两个进程之间如何交换文件。在这...
在Android应用开发中,客户端与服务器端的通信是不可或缺的一部分,它使得移动设备能够获取、发送数据,实现功能如登录注册、数据同步、文件上传下载等。本Demo着重展示了这一核心概念,通过实例来帮助开发者理解和...
在Android平台上进行网络编程,客户端与服务器端的交互是至关重要的。这个主题主要涉及的是如何通过URL方式获取网络数据,实现文件的下载、解压,以及文件的上传功能,同时涵盖了对SD卡文件的浏览。这里我们将深入...
服务器端接收到数据后,可以将其写入本地文件,还原成原始图片。为了提高效率,可以考虑使用QBuffer作为中间容器,以减少内存拷贝。 针对客户端关闭导致服务器端崩溃的问题,我们需要在服务器端添加异常处理机制。...
2. **请求与响应**:客户端(通常是Android应用)通过发送HTTP请求(GET、POST等)来向服务器端获取或者提交数据。服务器接收到请求后,处理数据并返回响应,响应中可能包含处理结果或需要返回的数据。 3. **JSON ...
通常,这会是一个POST请求,因为GET请求可能受到URL长度限制,不适用于大文件下载。 ```java public interface DownloadService { @POST("download") Call<ResponseBody> downloadFile(@Query("filename") String...
总结起来,这个任务涉及到VC客户端如何利用HTTP POST方法将文件上传到PHP服务器,以及服务器端如何接收并处理这些文件。在实际应用中,需要考虑安全性、错误处理和性能优化。理解这一过程对于开发涉及文件交互的Web...
这个例子主要涉及到了Ajax(异步JavaScript和XML)技术,用于实现客户端与服务器端的远程调用。Ajax允许网页不需重新加载整个页面的情况下更新部分网页内容,从而提升了用户体验。 首先,我们需要理解Ajax的工作...
例如,一个简单的网页加载过程就是客户端发送GET请求到服务器,服务器返回HTML内容。 三、数据交换格式 在客户端和服务器间传输的数据通常被编码为JSON或XML格式。JSON(JavaScript Object Notation)因其简洁性和...
这个Demo涵盖了从客户端到服务器端的基本数据发送和接收,以及验证过程。下面将详细解释这个Demo涉及到的知识点。 1. **Android网络请求库**: Android原生API进行网络操作较为繁琐,所以通常会使用第三方库,如`...
GET请求则将数据附加到URL上。 - **接收数据**:服务器响应的数据通常是JSON格式,Android客户端需要解析这些数据。使用`org.json`库,可以将JSON字符串转换为JSONObject或JSONArray,并提取所需信息。 2. **文件...
4. **文件上传机制**:文件上传通常涉及将文件分割成多个数据块,然后通过网络发送到服务器。服务器需要接收这些数据块,重组为原始文件,并保存到硬盘上。同时,需要处理错误检测和恢复,以确保文件完整无损。 5. ...
在这个例子中,`Configure`方法定义了路由,当客户端发送GET请求到根URL("/")时,服务器将返回"Hello World!"。 标签“webHttp”可能指的是Web API,这是一种构建RESTful服务的方法,用于使应用程序通过HTTP协议...
在Android客户端向Java服务器端上传文件的过程中,涉及到了多个关键的技术点和步骤,这包括了文件选择、HTTP请求、数据编码、服务器端处理等。以下将详细解释这些知识点。 1. **Android文件浏览器**:在Android应用...