`

android网络编程(八)使用HTTP协议和TCP协议实现上传文件

阅读更多
Android上传文件有两种方式,第一种是基于Http协议的HttpURLConnection,第二种是基于TCP协议的Socket。 这两种方式的区别是使用HttpURLConnection上传时内部有缓存机制,如果上传较大文件会导致内存溢出。如果用TCP协议Socket方式上传就会解决这种弊端。

HTTP协议HttpURLConnection

1. 通过URL封装路径打开一个HttpURLConnection

2.设置请求方式以及头字段:Content-Type、Content-Length、Host

3.拼接数据发送

示例:

	private static final String BOUNDARY = "---------------------------7db1c523809b2";//数据分割线

	public boolean uploadHttpURLConnection(String username, String password, String path) throws Exception {
		//找到sdcard上的文件
		File file = new File(Environment.getExternalStorageDirectory(), path);
                  //仿Http协议发送数据方式进行拼接
		StringBuilder sb = new StringBuilder();
		sb.append("--" + BOUNDARY + "\r\n");
		sb.append("Content-Disposition: form-data; name=\"username\"" + "\r\n");
		sb.append("\r\n");
		sb.append(username + "\r\n");

		sb.append("--" + BOUNDARY + "\r\n");
		sb.append("Content-Disposition: form-data; name=\"password\"" + "\r\n");
		sb.append("\r\n");
		sb.append(password + "\r\n");

		sb.append("--" + BOUNDARY + "\r\n");
		sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + path + "\"" + "\r\n");
		sb.append("Content-Type: image/pjpeg" + "\r\n");
		sb.append("\r\n");

		byte[] before = sb.toString().getBytes("UTF-8");
		byte[] after = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");

		URL url = new URL("http://192.168.1.16:8080/14_Web/servlet/LoginServlet");
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setRequestMethod("POST");
		conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
		conn.setRequestProperty("Content-Length", String.valueOf(before.length + file.length() + after.length));
		conn.setRequestProperty("HOST", "192.168.1.16:8080");
		conn.setDoOutput(true);	

		OutputStream out = conn.getOutputStream();
		InputStream in = new FileInputStream(file);
		
		out.write(before);

		byte[] buf = new byte[1024];
		int len;
		while ((len = in.read(buf)) != -1)
			out.write(buf, 0, len);

		out.write(after);

		in.close();
		out.close();
		return conn.getResponseCode() == 200;
	}


TCP协议Socket

1.我们可以使用Socket发送TCP请求,将上传数据分段发送

示例:

	public boolean uploadBySocket(String username, String password, String path) throws Exception {
		// 根据path找到SDCard中的文件
		File file = new File(Environment.getExternalStorageDirectory(), path);
		// 组装表单字段和文件之前的数据
		StringBuilder sb = new StringBuilder();

		sb.append("--" + BOUNDARY + "\r\n");
		sb.append("Content-Disposition: form-data; name=\"username\"" + "\r\n");
		sb.append("\r\n");
		sb.append(username + "\r\n");

		sb.append("--" + BOUNDARY + "\r\n");
		sb.append("Content-Disposition: form-data; name=\"password\"" + "\r\n");
		sb.append("\r\n");
		sb.append(password + "\r\n");

		sb.append("--" + BOUNDARY + "\r\n");
		sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + path + "\"" + "\r\n");
		sb.append("Content-Type: image/pjpeg" + "\r\n");
		sb.append("\r\n");

		// 文件之前的数据
		byte[] before = sb.toString().getBytes("UTF-8");
		// 文件之后的数据
		byte[] after = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");

		URL url = new URL("http://192.168.1.199:8080/14_Web/servlet/LoginServlet");

		// 由于HttpURLConnection中会缓存数据, 上传较大文件时会导致内存溢出, 所以我们使用Socket传输
		Socket socket = new Socket(url.getHost(), url.getPort());
		OutputStream out = socket.getOutputStream();
		PrintStream ps = new PrintStream(out, true, "UTF-8");

		// 写出请求头
		ps.println("POST /14_Web/servlet/LoginServlet HTTP/1.1");
		ps.println("Content-Type: multipart/form-data; boundary=" + BOUNDARY);
		ps.println("Content-Length: " + String.valueOf(before.length + file.length() + after.length));
		ps.println("Host: 192.168.1.199:8080");
		
		InputStream in = new FileInputStream(file);

		// 写出数据
		out.write(before);

		byte[] buf = new byte[1024];
		int len;
		while ((len = in.read(buf)) != -1)
			out.write(buf, 0, len);

		out.write(after);

		in.close();
		out.close();

		return true;
	}


搭建服务器,完成上传功能

package cn.test.web.servlet;

import java.io.File;
import java.io.IOException;
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.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		if (isMultipart)
			try {
				FileItemFactory factory = new DiskFileItemFactory();
				ServletFileUpload upload = new ServletFileUpload(factory);
				List<FileItem> items = upload.parseRequest(request);
				File dir = new File(request.getSession().getServletContext().getRealPath("/WEB-INF/upload"));
				//创建目录
				dir.mkdir();
				for (FileItem item : items)
					if (item.isFormField())
						System.out.println(item.getFieldName() + ": " + item.getString());
					else{
						item.write(new File(dir,item.getName().substring(item.getName().lastIndexOf("\\")+1)));
					}
			} catch (Exception e) {
				e.printStackTrace();
			}
		else {
			System.out.println(request.getMethod());
			System.out.println(request.getParameter("username"));
			System.out.println(request.getParameter("password"));
		}
	}
}
分享到:
评论

相关推荐

    Android编程使用HTTP协议与TCP协议实现上传文件的方法

    本文实例讲述了Android编程使用HTTP协议与TCP协议实现上传文件的方法。分享给大家供大家参考,具体如下: Android上传文件有两种方式,第一种是基于Http协议的HttpURLConnection,第二种是基于TCP协议的Socket。 这...

    Android中使用自定义协议实现文件断点上传案例

    总结,实现Android中的自定义协议文件断点上传涉及协议设计、Socket连接、文件分割、块上传以及错误处理等多个环节。这个过程需要对网络编程有深入理解,同时考虑到网络状况和用户体验,确保上传的可靠性和效率。...

    Android应用源码http、udp、tcp网络交互组件

    本项目"Android应用源码http、udp、tcp网络交互组件"提供了一个开源解决方案,用于处理HTTP、UDP和TCP这三种常见的网络协议。以下将详细介绍这三种网络协议及其在Android中的应用。 1. HTTP(超文本传输协议):...

    Android 客户端tcp传输demo

    这个“Android客户端TCP传输demo”是为开发者提供一个基础的平台,了解和学习如何在Android应用中实现TCP通信,尤其是涉及到文件的上传和下载功能。 TCP协议保证了数据的顺序和完整性,通过三次握手建立连接,并...

    android手写Http协议上传文件

    "android手写Http协议上传文件"这个主题就是关于如何利用Socket编程实现一个简单的HTTP协议来上传本地文件到服务器的过程。下面将详细讲解这个过程涉及的关键知识点。 1. **HTTP协议基础**: HTTP(超文本传输协议...

    安卓TCP文件上传

    在安卓平台上进行TCP文件...总的来说,实现安卓TCP文件上传涉及到网络编程、多线程、文件操作等多个技术领域,需要对Android SDK和网络通信有深入的理解。通过实践和优化,我们可以构建出高效、稳定的文件上传系统。

    Android中http协议上传文件

    本文主要介绍了如何在Android中使用HTTP协议上传文件的相关知识点,包括HTTP协议的基本概念、GET与POST请求方法的区别以及实际的代码实现。此外,还简要介绍了Socket通信的基础知识,为读者提供了一个全面了解...

    android使用socket上传、下载文件

    在Android平台上,Socket通信是一种常见的网络...以上就是使用Socket在Android中实现文件上传和下载的基本步骤和注意事项。实际开发中,可能还需要考虑多线程处理、断点续传、进度显示等功能,以提供更好的用户体验。

    android 网络编程 客户端完整代码 socket http

    本文将深入探讨Android中基于Socket和HTTP的网络编程,包括它们的概念、实现方式以及如何构建一个完整的客户端代码。 1. Socket(套接字)网络编程: Socket是网络通信的基础,它提供了进程间通信的能力,使得运行...

    Android TCPIP文件分割上传Demo

    在Android应用开发中,有时我们需要实现大文件的上传功能,特别是在网络环境不稳定或者带宽有限的情况下,文件分块上传(TCP/IP协议)是一种常见的优化策略。这个“Android TCPIP文件分割上传Demo”就是一个实例,...

    Android应用源码http、udp、tcp网络交互组件.zip

    在Android应用开发中,网络交互是必不可少的一部分,无论是下载数据、上传用户信息还是实时通信,都离不开HTTP、UDP和TCP这三种主要的网络协议。这个压缩包“Android应用源码http、udp、tcp网络交互组件.zip”包含了...

    android FTP 文件上传 socket 源码

    在Android平台上进行FTP文件上传,通常涉及到网络编程和文件操作,这两个方面是Android开发中的重要组成部分。FTP(File Transfer Protocol)是一种广泛使用的网络协议,用于在客户端和服务器之间传输文件。Socket是...

    Android与服务器通信(TCP&UDP

    在Android应用开发中,与服务器进行通信是必不可少的环节,无论是获取数据、上传用户信息还是进行实时交互,都需要借助网络协议来实现。本教程将详细探讨Android应用如何使用TCP和UDP这两种常用网络传输协议与服务器...

    Android 4.0网络编程详解

    在Android 4.0网络编程中,开发者可以利用多种技术和API来实现应用程序与网络的交互,从而实现数据的获取、发送、同步等功能。本篇详解将深入探讨Android平台上的网络编程,涵盖HTTP通信、套接字编程、数据传输格式...

    android tcp通讯客户端源码

    这个文件很可能是包含Android客户端TCP通信实现的源代码文件,可能包含了建立连接、发送数据以及处理异常的逻辑。分析这个文件的代码可以帮助我们理解具体的实现细节,如错误处理、连接超时、数据编码格式等。 6. ...

    android网络编程详解源码(1至7章)

    - 套接字(Socket)编程基础,理解TCP和UDP通信协议。 - 在Android中创建ServerSocket和Socket,建立客户端和服务器之间的连接。 - 数据的发送和接收,使用InputStream和OutputStream处理字节流。 - 实现聊天...

    Android TCPIP断点上传文件Demo

    在这个“Android TCPIP断点上传文件Demo”中,开发者将学习如何实现在Android设备上通过TCP/IP协议进行断点续传的文件上传功能,同时服务器端是用Eclipse开发的,这表明涉及到Java后端的知识。 首先,让我们理解TCP...

    Android应用源码http、udp、tcp网络交互组件-IT计算机-毕业设计.zip

    在毕业设计中,通过分析和实践这些网络组件的源码,学生可以深入理解网络通信的原理,学习如何在Android环境中实现网络请求,处理数据流,以及如何优化网络性能。同时,这个项目也可以帮助学生掌握Android的异步处理...

    android断点上传文件

    在Android开发中,断点上传是一项重要的功能,它允许用户在网络连接不稳定或者设备突然断电的情况下,能够继续之前未完成的文件上传过程。这通常涉及到网络编程,特别是使用Socket通信机制来实现。以下是对这个主题...

Global site tag (gtag.js) - Google Analytics