- 浏览: 538018 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
tangyunliang:
大哥你太历害了谢谢
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
u013015029:
LZ,请问下,在// 添加消息到聊天窗口 , 这里获取Ed ...
Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信 -
endual:
怎么保持会话,我搞不懂啊
Android基于XMPP Smack Openfire开发IM【一】登录openfire服务器 -
donala_zq:
显示:[2013-11-30 11:50:36 - Andro ...
android-----------新浪微博 -
donala_zq:
哥,运行不了啊
android-----------新浪微博
Android上传文件有两种方式,第一种是基于Http协议的HttpURLConnection,第二种是基于TCP协议的Socket。 这两种方式的区别是使用HttpURLConnection上传时内部有缓存机制,如果上传较大文件会导致内存溢出。如果用TCP协议Socket方式上传就会解决这种弊端。
HTTP协议HttpURLConnection
1. 通过URL封装路径打开一个HttpURLConnection
2.设置请求方式以及头字段:Content-Type、Content-Length、Host
3.拼接数据发送
示例:
TCP协议Socket
1.我们可以使用Socket发送TCP请求,将上传数据分段发送
示例:
搭建服务器,完成上传功能
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中如何模拟一次点击(touch)事件
2014-05-06 10:41 0在Android中有时需要模拟某一个View的touch事件, ... -
Android程序Crash时的异常上报
2014-04-28 18:15 0http://blog.csdn.net/singwhatiw ... -
android程序中证书签名校验的方法
2014-04-28 17:58 2015android程序中证书签名校验的方法一 2013-02 ... -
MD5理解错了,哎
2014-03-17 14:14 0MD5只对数据加密是无法解密的,也就是说,你把100加密后,就 ... -
Android 获取网络时间
2014-03-12 11:42 2048Android 获取网络时间 在网上看到的最常见的方式有: ... -
SQLite清空表并将自增列归零
2014-03-05 18:02 1558SQLite清空表并将自增列归零 作者:Zhu Yanfeng ... -
Handler小看一下
2013-11-11 16:42 0android handler调用post方法还是阻塞 su ... -
Frame Animation小看一下
2013-10-12 16:30 815Demo运行效果图: 源码: -
动画小学一下
2013-10-12 16:14 741转自: http://www.eoeandroid.com/f ... -
Android 动画之ScaleAnimation应用详解
2013-10-12 15:49 1026===============eoeAndroid社区推荐:= ... -
android开发中的一个工具类
2013-06-19 16:04 0package com.wanpu.login.dialog; ... -
android TextView怎么设置个别字体颜色并换行?
2013-06-20 09:25 1709(1)、TextView 设置个别字体颜色 TextView ... -
Android开发之文件下载,状态时显示下载进度,点击自动安装
2013-05-07 15:38 1440在进行软件升级时,需要进行文件下载,在这里实现自定义的文件下载 ... -
android中的状态保存
2013-04-07 14:21 986package com.zzl.call; import ... -
android动画基础:tween动画
2013-04-06 11:21 1268工程结构图: [img] [/img] 四个动画的xml ... -
面试中遇到的几个问题
2013-06-09 11:56 1025SAX与DOM之间的区别 SAX ( ... -
Android获取其他包的Context实例,然后调用它的方法,反射!!!
2013-03-25 10:32 1234Android中有Context的概念,想必大家都知道。Con ... -
Android的内存机制和常见泄漏情形
2013-03-06 16:55 800一、 Android的内存机制 Android的程序由Ja ... -
JUnit测试小小demo
2013-03-06 16:37 1187运行效果图: [img] [/img] 项目结构图 ... -
android开发中的异常小工具
2013-03-04 15:53 906package com.zzl.tools; impor ...
相关推荐
本文实例讲述了Android编程使用HTTP协议与TCP协议实现上传文件的方法。分享给大家供大家参考,具体如下: Android上传文件有两种方式,第一种是基于Http协议的HttpURLConnection,第二种是基于TCP协议的Socket。 这...
总结,实现Android中的自定义协议文件断点上传涉及协议设计、Socket连接、文件分割、块上传以及错误处理等多个环节。这个过程需要对网络编程有深入理解,同时考虑到网络状况和用户体验,确保上传的可靠性和效率。...
本项目"Android应用源码http、udp、tcp网络交互组件"提供了一个开源解决方案,用于处理HTTP、UDP和TCP这三种常见的网络协议。以下将详细介绍这三种网络协议及其在Android中的应用。 1. HTTP(超文本传输协议):...
这个“Android客户端TCP传输demo”是为开发者提供一个基础的平台,了解和学习如何在Android应用中实现TCP通信,尤其是涉及到文件的上传和下载功能。 TCP协议保证了数据的顺序和完整性,通过三次握手建立连接,并...
"android手写Http协议上传文件"这个主题就是关于如何利用Socket编程实现一个简单的HTTP协议来上传本地文件到服务器的过程。下面将详细讲解这个过程涉及的关键知识点。 1. **HTTP协议基础**: HTTP(超文本传输协议...
在安卓平台上进行TCP文件...总的来说,实现安卓TCP文件上传涉及到网络编程、多线程、文件操作等多个技术领域,需要对Android SDK和网络通信有深入的理解。通过实践和优化,我们可以构建出高效、稳定的文件上传系统。
本文主要介绍了如何在Android中使用HTTP协议上传文件的相关知识点,包括HTTP协议的基本概念、GET与POST请求方法的区别以及实际的代码实现。此外,还简要介绍了Socket通信的基础知识,为读者提供了一个全面了解...
在Android平台上,Socket通信是一种常见的网络...以上就是使用Socket在Android中实现文件上传和下载的基本步骤和注意事项。实际开发中,可能还需要考虑多线程处理、断点续传、进度显示等功能,以提供更好的用户体验。
本文将深入探讨Android中基于Socket和HTTP的网络编程,包括它们的概念、实现方式以及如何构建一个完整的客户端代码。 1. Socket(套接字)网络编程: Socket是网络通信的基础,它提供了进程间通信的能力,使得运行...
在Android应用开发中,有时我们需要实现大文件的上传功能,特别是在网络环境不稳定或者带宽有限的情况下,文件分块上传(TCP/IP协议)是一种常见的优化策略。这个“Android TCPIP文件分割上传Demo”就是一个实例,...
在Android应用开发中,网络交互是必不可少的一部分,无论是下载数据、上传用户信息还是实时通信,都离不开HTTP、UDP和TCP这三种主要的网络协议。这个压缩包“Android应用源码http、udp、tcp网络交互组件.zip”包含了...
在Android平台上进行FTP文件上传,通常涉及到网络编程和文件操作,这两个方面是Android开发中的重要组成部分。FTP(File Transfer Protocol)是一种广泛使用的网络协议,用于在客户端和服务器之间传输文件。Socket是...
在Android应用开发中,与服务器进行通信是必不可少的环节,无论是获取数据、上传用户信息还是进行实时交互,都需要借助网络协议来实现。本教程将详细探讨Android应用如何使用TCP和UDP这两种常用网络传输协议与服务器...
在Android 4.0网络编程中,开发者可以利用多种技术和API来实现应用程序与网络的交互,从而实现数据的获取、发送、同步等功能。本篇详解将深入探讨Android平台上的网络编程,涵盖HTTP通信、套接字编程、数据传输格式...
这个文件很可能是包含Android客户端TCP通信实现的源代码文件,可能包含了建立连接、发送数据以及处理异常的逻辑。分析这个文件的代码可以帮助我们理解具体的实现细节,如错误处理、连接超时、数据编码格式等。 6. ...
- 套接字(Socket)编程基础,理解TCP和UDP通信协议。 - 在Android中创建ServerSocket和Socket,建立客户端和服务器之间的连接。 - 数据的发送和接收,使用InputStream和OutputStream处理字节流。 - 实现聊天...
在这个“Android TCPIP断点上传文件Demo”中,开发者将学习如何实现在Android设备上通过TCP/IP协议进行断点续传的文件上传功能,同时服务器端是用Eclipse开发的,这表明涉及到Java后端的知识。 首先,让我们理解TCP...
在毕业设计中,通过分析和实践这些网络组件的源码,学生可以深入理解网络通信的原理,学习如何在Android环境中实现网络请求,处理数据流,以及如何优化网络性能。同时,这个项目也可以帮助学生掌握Android的异步处理...
在Android开发中,断点上传是一项重要的功能,它允许用户在网络连接不稳定或者设备突然断电的情况下,能够继续之前未完成的文件上传过程。这通常涉及到网络编程,特别是使用Socket通信机制来实现。以下是对这个主题...