没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客户端。完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送如何从Socket中接受HTTP响应(Response header, Response body)报文并解析与保存文件内容。如何通过SwingWork实现UI刷新,实时显示下载进度。
首先看一下UI部分:
【添加下载】按钮:
点击弹出URL输入框,用户Copy要下载文件URL到输入框以后,点击[OK]按钮即开始
下载
【清除完成】按钮:
清除所有已经下载完成的文件列表
文件下载状态分为以下几种:
?
UI部分主要是利用Swing组件完成。点击【添加下载】执行的代码如下:
?
【清除完成】按钮执行的代码如下:
?
让JFrame组件居中显示的代码如下:
?
HTTP协议实现部分:
概述:HTTP请求头与相应头报文基本结构与解释
HTTP请求:一个标准的HTTP请求报文如
其中请求头可以有多个,message-body可以没有,不是必须的。请求行的格式如下:
Request-Line = Method SP Request-URI SPHTTP-Version CRLF 举例说明如下:
?
其中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响应报文如下
最先得到是状态行,其格式如下:
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连接
?
用了URL类来把用户输入的url string变成容易解析一点的URL。
二、构造HTTP请求
?
三、发送HTTP请求
?
四、接受HTTP响应并解析内容,写入创建好的文件
?
简单的HTTP响应头解析类HttpResponseHeaderParser代码如下:
?
以上就是本文的全部内容,希望对大家的学习java程序设计有所帮助。