首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java Socket编程 - 基于Socket实现HTTP上载客户端

2012-12-25 
Java Socket编程 - 基于Socket实现HTTP下载客户端没有借助任何第三方库,完全基于JAVA Socket实现一个最小

Java Socket编程 - 基于Socket实现HTTP下载客户端

没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客

户端。完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送

如何从Socket中接受HTTP响应(Response header, Response body)报文并解析与

保存文件内容。如何通过SwingWork实现UI刷新,实时显示下载进度。

首先看一下UI部分:

Java Socket编程 - 基于Socket实现HTTP上载客户端

【添加下载】按钮:

点击弹出URL输入框,用户Copy要下载文件URL到输入框以后,点击[OK]按钮即开始

下载

Java Socket编程 - 基于Socket实现HTTP上载客户端

【清除完成】按钮:

清除所有已经下载完成的文件列表

文件下载状态分为以下几种:


其中请求头可以有多个,message-body可以没有,不是必须的。请求行的格式如下:

Request-Line = Method SP Request-URI SPHTTP-Version CRLF 举例说明如下:

Request-Line = GET http://www.w3.org/pub/WWW/TheProject.htmlHTTP/1.1\r\n

其中SP表示空格, CRLF表示回车换行符\r\n

当你想要上传文件时候,使用Post方式来填写数据到message-body中即可。发送一个

简单的HTTP请求报文如下:

GET /pub/WWW/TheProject.html HTTP/1.1\r\n

Host: www.w3.org\r\n

\r\n

HTTP响应:一个标准的HTTP响应报文如下

Java Socket编程 - 基于Socket实现HTTP上载客户端

最先得到是状态行,其格式如下:

Status-Line = HTTP-Version SP Status-CodeSP Reason-Phrase CRLF, 一个状态行的

简单例子如下:Status-Line = HTTP/1.1 200 OK一般大家最喜欢的就是Status-Code会

给你很多提示,最常见的就是404,500等状态码。状态码的意思可以参考RFC2616中

的解释。下载文件最要紧是的检查HTTP响应头中的Content-Length与Content-Type两

个中分别声明了文件的长度与文件的类型。其它如Accept-Ranges表示接受多少到多少

的字节。可能在多线程下载中使用。搞清楚了HTTP请求与响应的报文格式以后,我们

就可以通过Socket按照报文格式解析内容,发送与读取HTTP请求与响应。具体步骤

如下:

一:根据用户输入的文件URL建立Socket连接

package com.gloomyfish.socket.tutorial.http.download;import java.util.HashMap;import java.util.Map;/** * it can parse entity header, response head * and response line <status code, CharSet, ect...> * refer to RFC2616,关于HTTP响应头,请看RFC文档,描写的很详细啊!! *  * @author fish * */public class HttpResponseHeaderParser {public final static String CONTENT_LENGTH = "Content-Length";public final static String CONTENT_TYPE = "Content-Type";public final static String ACCEPT_RANGES = "Accetp-Ranges";private Map<String, String> headerMap;public HttpResponseHeaderParser() {headerMap = new HashMap<String, String>();}/** * <p> get the response header key value pair </p> * @param responseHeaderLine */public void addResponseHeaderLine(String responseHeaderLine) {if(responseHeaderLine.contains(":")) {String[] keyValue = responseHeaderLine.split(": ");if(keyValue[0].equalsIgnoreCase(CONTENT_LENGTH)) {headerMap.put(CONTENT_LENGTH, keyValue[1]);} else if(keyValue[0].equalsIgnoreCase(CONTENT_TYPE)) {headerMap.put(CONTENT_TYPE, keyValue[1]);} else {headerMap.put(keyValue[0], keyValue[1]);}}}public int getFileLength() {if(headerMap.get(CONTENT_LENGTH) == null){return 0;}return Integer.parseInt(headerMap.get(CONTENT_LENGTH));}public String getFileType() {return headerMap.get(CONTENT_TYPE);}public Map<String, String> getAllHeaders() {return headerMap;}}

可执行的Jar文件下载地址(这次我要点分):

http://download.csdn.net/detail/jia20003/4862076

转载请务必注明


热点排行