最近在做web服务器的时候将一些应用集成在了服务器里面,比如说文件上传,结果调试用了一个星期的时间,搞得自己头昏脑涨,现在总于解决了,现将注意细节叙述如下: http上传协议很简单,用post协议,协议头部包含Content-Length项,这是一次上传的所有body部分长度总和,包括多文件之间的分割等等,所以也就难怪了,http上传要比ftp等慢,其实慢就慢在body解析上,下面对于文件分割作一些阐述。 一个典型的http上传协议头类似于这样:
POST /public/upload.action HTTP/1.1 ost: maiit.com:8088 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5) Gecko/2008041514 Firefox/3.0b5 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 ccept-Encoding: gzip,deflate ccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://maiit.com:8088/public/up.html Content-Type: multipart/form-data; boundary=---------------------------88739631214394723612117964652 Content-Length: 3433 其中,boundary是文件分割符号,每个文件以如下字段开头 -----------------------------88739631214394723612117964652 Content-Disposition: form-data; name="file"; filename="hashtables.h" Content-Type: text/x-chdr 以如下字段结尾: -----------------------------88739631214394723612117964652 Content-Disposition: form-data; name="uploadButton"
up -----------------------------88739631214394723612117964652--
其中并没有包含单个文件的长度,这就是对于传输大文件性能不高的关键所在,因为应用服务器必须对每次的数据进行比对,查找文件分割符号,加入传输一个100M的文件,服务器端cpu必须对这100M的文件每一个字节进行字符串比对,那么有没有解决办法呢? web服务器一般只将请求的数据直接转发给应用层,不做任何处理(除了HTTP协议头),假设你可以直接控制web服务器,类似于我现在的状况,就有了解决办法,比如我的服务器模型是epoll事件驱动,通过分析发现,对于flash等上传途径flash已经做了优化,数据并不是一股脑地发送过来,而是先发送协议头部,然后发送一个文件分割符部分数据,在然后才是正文,正文最后一个数据包不管是否等于socketBuffer,结尾标识有可能会下次发送,这样一个过程就给了我们一个解决途径,几乎不用分析(除了文件名称)任何一个文件数据包就能完成地保存下来文件,因为数据是分段发送的,并没有粘滞在一起,通过比对发送次数就可以确定,http协议头的第一个数据包肯定是单独发送的,然后才会转向文件处理程序,然后接收第2个数据包,并且flash上传文件不管是多文件还是单文件其实都是按照单个文件分次上传的,这样传送过程就可控了。 注意上面的“有可能”几个字,这几天困扰我的也在于此,flash并不是想象中的稳定的,不同版本之间是不一样的,linux上和windows上的解析也是不一样的,这样就不能给我们一个统一的解决途径,我也是在测试中才发现这样的问题的,不仅仅如此,flash的很多特性as3和as2根本不兼容,一个不向下兼容的软件这样流行真是让人费解,并且上述的解决途径不不适合传送的页面http上传,页面上传基本上就是直接混合在一起的,所以这个最高效的解决途径看来要放弃了,几天的测试改进发现还还是有解决办法的,于是就有了下面的处理模式。 既然对于没个文件都是有一个开头标识和结尾标识,那不防在这上面做作文章,如果能只分析开头和结尾而不分析中间数据,那么对于大型文件http传送将是一件幸事,开头倒是好分析,对没个数据包分析知道有文件开头为止,问题就在于结尾,不知道文件长度的情况下你怎么知道何时分析一个数据包是否包含结尾?幸好有这样一个共同特性,对于单个文件传送,最后一个包含结尾的数据包在总length传送=0的时候总是完整地发送地(不会有一部分放在前一个socket交互另一个放在后一个,估计这是浏览器在发送没个文件的时候后面不会主动将文本附加在最后一个数据包),所以当总length小于SocketBuffer得时候就是分析文件结尾的时候,这样我们最总最多分析2次开头,2次结尾,我在缓存设为16K的时候局域网就可以达到3M的上传速度,最大64k缓存(刚好等于socket最大缓存)的时候能大到9M/秒的上传速度,几乎等于UDP的速度,对于大型文件的优势可想而知。
这里依然存在的问题是之支持flash多文件上传和http单文件上传,当然,如果你是一个视频上传等程序这足够用了,这里抛砖引玉,望高手共同探讨
|
相关推荐
《Unity网络传输:Best HTTP Pro深度解析》 在Unity游戏开发中,网络传输是不可或缺的一环,它使得游戏能够实现实时的多人交互、数据同步等功能。Best HTTP Pro是一款强大的网络通信库,针对Unity提供了Http、...
《Akka HTTP 源码深度解析》 Akka HTTP 是一个基于 Akka Toolkit 的高性能、低级的 HTTP 服务器和客户端库,它为构建现代、反应式、容错的 Web 应用提供了强大的工具。在深入理解 Akka HTTP 的源码之前,我们需要先...
FastDFS是一款开源的高性能、轻量级的分布式文件系统,主要用于解决大容量存储和负载均衡的问题。在互联网应用中,它常用于存储图片、文档等静态文件,尤其适合高并发访问的场景。本篇文章将深入探讨FastDFS的核心...
FastDFS是一个开源的高性能分布式文件系统,它主要解决海量数据存储和负载均衡问题,特别适合以文件为载体的在线服务,如图片、视频分享网站等。FastDFS设计的目标是提供高可用性、高扩展性,并且易于部署和维护。 ...
### Linux常用命令全集:深度解析与应用指南 在Linux操作系统中,命令行是进行系统管理、文件操作、网络配置等任务的核心工具。本文将基于《Linux常用命令全集》的目录,对其中的关键知识点进行深入解读,涵盖文件...
- 读取BMP文件:首先,我们需要解析BMP文件的头部信息,获取图像的宽度、高度、位深度等参数,并读取像素数据。 - 转换颜色空间:BMP通常使用RGB色彩模型,而JPG通常使用YCbCr色彩模型。因此,需要将RGB数据转换为...
- 支持对类文件进行深度解析。 - 可以用来动态生成类或修改已有的类文件。 - 提供了一系列工具类来简化字节码级别的操作。 #### BeanUtil - JavaBean 工具 - **简介**:BeanUtil 是一组用于处理 JavaBean 的...
- 更高的内存计算性能。 - 统一的编程模型支持多种计算范式。 - 丰富的库支持机器学习、图处理等。 **16. 数据倾斜的产生和解决方法** - 产生的原因:数据分布不均。 - 解决方法:调整分区策略、使用Salting等。 ...
FastDFS是一款开源的高性能、轻量级的分布式文件系统,由国人谢恩明开发。它专为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等需求,解决大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务...
#### 三、Java NIO 深度解析 - **NIO介绍**:Java NIO (New IO) 是Java 1.4版本后引入的新API,用于替代传统的BIO (Blocking IO),旨在提高文件读写的性能。 - **NIO关键组件**: - **Buffer**:缓冲区,用于数据...
《CuteFTP Professional:专业级FTP工具的深度解析》 CuteFTP Professional是一款深受用户喜爱的FTP(File Transfer Protocol)客户端软件,它以其强大的功能、易用性和稳定性在众多FTP工具中脱颖而出。作为专业...
FastDFS是一款开源的高性能、轻量级的分布式文件系统,主要用于解决海量数据存储和负载均衡的问题。在互联网应用中,它常用于存储图片、文档等大文件,尤其适合高并发访问和大量文件存储的场景。本文将围绕FastDFS的...
《FastDFS深度解析与实践应用》 FastDFS是一款开源的高性能、轻量级的分布式文件系统,主要用于解决大容量存储和负载均衡的问题。它专为互联网应用设计,具有高可用性、高性能、易于部署和使用的特点。在本篇文章中...
《HttpHelper:经典HTTP访问工具类的深度解析与应用》 HttpHelper,作为一个经典且广泛使用的.NET框架HTTP访问工具类,对于任何进行网络通信的开发者来说,都是一个必不可少的利器。HttpHelper V1.8-Net2.0版是专为...
《FastDFS深度解析与实践应用》 FastDFS是一款开源的高性能、轻量级的分布式文件系统,主要用于解决大容量存储和负载均衡的问题。其设计目标是简化文件服务器的搭建和维护,提供高可用性和高扩展性,使得在互联网...
Java编程语言在处理多媒体文件,特别是视频文件时,常常需要获取诸如时长、分辨率、高宽比以及码率等关键信息。Xuggler是一个强大的开源库,专为处理音视频数据而设计,它提供了丰富的API,使得在Java环境中解析和...
《FastDFS深度解析与实践》 FastDFS是一个开源的、高性能的、轻量级的分布式文件系统,由著名程序员fishman开发,专为互联网应用设计。它的主要功能是存储和管理大量的小文件,如图片、视频片段等。FastDFS不仅在...
### Hadoop分布式文件系统使用指南:深度解析与实践 #### 概述 Hadoop分布式文件系统(HDFS)是Hadoop框架的核心组成部分之一,旨在处理大规模数据集的存储与访问需求。HDFS的设计目标是在商用硬件上实现高容错性...
《Linux远程管理工具FinalShell深度解析》 在IT行业中,远程管理工具是系统管理员和开发者的得力助手,尤其在处理分布式系统或者多服务器环境时,这类工具的重要性不言而喻。FinalShell是一款专为Linux系统设计的...
eMuleP2P协议不仅实现了高效的文件共享,还在网络结构、数据包格式、传输机制等方面展现了深度的技术考量。通过客户端-服务器模型和P2P元素的结合,eMule构建了一个既中心化又分布式的文件共享网络,为全球范围内的...