F:\SOFT>nc article.tianyaclub.com 80 HEAD /tenya/tianya050124001.jpgHTTP/1.1 404 Object Not Found Server: Microsoft-IIS/5.0 Date: Thu, 07 Apr 2005 05:27:53 GMT Content-Type: text/html Content-Length: 111<html><head><title>Site Not Found</title></head> <body>No web site is configured at this address.</body></html>
测试成功!写得很粗糙,你可再改良一下!Option Explicit Private strURL As String Private mstrFileName As String, mlngFileNum As Long Private mlngFileLen As Long, mlngCurByte As Long Private mblnOnlyLen As Boolean, mblnPutStart As BooleanPrivate Sub Form_Load() strURL = "http://article.tianyaclub.com/tenya/tianya050124001.jpg" mstrFileName = App.Path & "\1.jpg" Label1.Caption = "文件总字节:0" Label2.Caption = "已下载字节:0" Command1.Caption = "开始下载" Command2.Caption = "取得长度" End SubPrivate Sub Command1_Click() mblnOnlyLen = False DownFile End SubPrivate Sub Command2_Click() mblnOnlyLen = True Label1.Caption = "文件总字节:0" DownFile End SubPrivate Sub DownFile() mblnPutStart = False Label2.Caption = "已下载字节:0" Command1.Enabled = False Command2.Enabled = False With Winsock1 If .State <> sckClosed Then .Close .Protocol = sckTCPProtocol .RemoteHost = "article.tianyaclub.com" .RemotePort = 80 .Connect End With End SubPrivate Sub Winsock1_Connect() Dim s As String s = "GET " + strURL + " HTTP/1.0" + vbCrLf s = s + "Accept: */*" + vbCrLf s = s & "Pragma: no-cache" & vbCrLf s = s & "Cache-Control: no-cache" & vbCrLf s = s & "Connection: close" & vbCrLf & vbCrLf s = s + vbCrLf Winsock1.SendData s End SubPrivate Sub CloseAll() If Winsock1.State <> sckClosed Then Winsock1.Close Close #mlngFileNum Command1.Enabled = True Command2.Enabled = True End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim RevData() As Byte Dim a() As Byte, b() As String, c() As String Dim s As String, i As Long, k As Long On Error GoTo fail If mblnPutStart = False Then Winsock1.PeekData RevData, vbArray Or vbByte k = InStrB(1, RevData, ChrB(13) & ChrB(10) & ChrB(13) & ChrB(10)) If k > 0 Then Winsock1.GetData RevData, vbArray Or vbByte a = LeftB(RevData, k - 1) RevData = MidB(RevData, k + 4) s = StrConv(a, vbUnicode) b = Split(s, vbCrLf) If InStr(1, b(0), "200 OK", vbTextCompare) = 0 Then GoTo fail For i = 1 To UBound(b) c = Split(b(i), ": ") Select Case c(0) Case "Content-Length" mlngFileLen = CLng(c(1)) Label1.Caption = "文件总字节:" & mlngFileLen If mblnOnlyLen Then CloseAll Exit Sub End If End Select Next mblnPutStart = True mlngCurByte = UBound(RevData) + 1 mlngFileNum = FreeFile Open mstrFileName For Binary As #mlngFileNum Else Exit Sub End If Else Winsock1.GetData RevData, vbArray Or vbByte mlngCurByte = mlngCurByte + bytesTotal End If Put #mlngFileNum, , RevData Label2.Caption = "已下载字节:" & mlngCurByte If mlngCurByte = mlngFileLen Then CloseAll MsgBox "下载成功!" End If Exit Sub fail: CloseAll MsgBox "网络传输错误,文件下载失败!" End Sub
在头部找到“Content-Length”标识,就是文件长度。
例如,用什么方法可以取得下面这个文件的长度(是下载前,不是DOWN完以后)?
strURL = "http://article.tianyaclub.com/tenya/tianya050124001.jpg"
发送 “HEAD /tenya/tianya050124001.jpg”指令
返回的信息里面就有ContentLength
HEAD /tenya/tianya050124001.jpgHTTP/1.1 404 Object Not Found
Server: Microsoft-IIS/5.0
Date: Thu, 07 Apr 2005 05:27:53 GMT
Content-Type: text/html
Content-Length: 111<html><head><title>Site Not Found</title></head>
<body>No web site is configured at this address.</body></html>
具体的命令格式我也不记得了………… :)
==============================
4.1 消息类型(Message Types)
HTTP消息由客户端到服务器的请求和由服务器到客户端的回应组成。HTTP-message = Simple-Request ; HTTP/0.9 messages
| Simple-Response
| Full-Request ; HTTP/1.0 messages
| Full-Response 完整的请求(Full-Request)和完整的回应(Full-Response)都使用RFC822[7]中实体传
输部分规定的消息格式。两者的消息都可能包括标题域(headers,可选)、实体主体(entity
body)。实体主体与标题间通过空行来分隔(即CRLF前没有内容的行)。Full-Request = Request-Line ; Section 5.1
*( General-Header ; Section 4.3
| Request-Header ; Section 5.2
| Entity-Header ) ; Section 7.1
CRLF
[ Entity-Body ] ; Section 7.2Full-Response = Status-Line ; Section 6.1
*( General-Header ; Section 4.3
| Response-Header ; Section 6.2| Entity-Header ) ; Section 7.1
CRLF
[ Entity-Body ] ; Section 7.2
简单请求(Simple_Request)与简单回应(Simple-Response)不允许使用任何标题信息,
并限制只能使用唯一的请求方法(GET) Simple-Request = "GET" SP Request-URI CRLF Simple-Response = [ Entity-Body ]
不提倡使用简单方式请求格式,因为它防止了服务器在接到简单请求时对返回实体的介
质类型进行验证。5. 请求(Request)
从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法、资源的标识符
及使用的协议。考虑到局限性更大的HTTP/0.9的向后兼容问题,有两种合法的HTTP请求
格式:Request = Simple-Request | Full-RequestSimple-Request = "GET" SP Request-URI CRLFFull-Request = Request-Line ; Section 5.1
*( General-Header ; Section 4.3
| Request-Header ; Section 5.2
| Entity-Header ) ; Section 7.1
CRLF
[ Entity-Body ] ; Section 7.2 如果HTTP/1.0服务器收到简单请求,它必须回应一个HTTP/0.9格式的简单回应。
HTTP/1.0的客户端有能力接收完整回应,但不能产生简单请求。8.2 HEAD
HEAD方法与GET几乎一样,区别在于,HEAD方法不让服务器在回应中返回任何实
体。对HEAD请求的回应部分来说,它的HTTP标题中包含的元信息与通过GET请求所得
到的是相同的。通过使用这种方法,不必传输整个实体主体,就可以得到请求URI所指定
资源的元信息。该方法通常用来测试超链接的合法性、可访问性及最近更新。
与条件GET不同,不存在所谓的“条件HEAD”,即"conditional HEAD"。即使在HEAD
请求中指定If-Modified-Since标题域,它也会被忽略。
Private strURL As String
Private mstrFileName As String, mlngFileNum As Long
Private mlngFileLen As Long, mlngCurByte As Long
Private mblnOnlyLen As Boolean, mblnPutStart As BooleanPrivate Sub Form_Load()
strURL = "http://article.tianyaclub.com/tenya/tianya050124001.jpg"
mstrFileName = App.Path & "\1.jpg"
Label1.Caption = "文件总字节:0"
Label2.Caption = "已下载字节:0"
Command1.Caption = "开始下载"
Command2.Caption = "取得长度"
End SubPrivate Sub Command1_Click()
mblnOnlyLen = False
DownFile
End SubPrivate Sub Command2_Click()
mblnOnlyLen = True
Label1.Caption = "文件总字节:0"
DownFile
End SubPrivate Sub DownFile()
mblnPutStart = False
Label2.Caption = "已下载字节:0"
Command1.Enabled = False
Command2.Enabled = False
With Winsock1
If .State <> sckClosed Then .Close
.Protocol = sckTCPProtocol
.RemoteHost = "article.tianyaclub.com"
.RemotePort = 80
.Connect
End With
End SubPrivate Sub Winsock1_Connect()
Dim s As String
s = "GET " + strURL + " HTTP/1.0" + vbCrLf
s = s + "Accept: */*" + vbCrLf
s = s & "Pragma: no-cache" & vbCrLf
s = s & "Cache-Control: no-cache" & vbCrLf
s = s & "Connection: close" & vbCrLf & vbCrLf
s = s + vbCrLf
Winsock1.SendData s
End SubPrivate Sub CloseAll()
If Winsock1.State <> sckClosed Then Winsock1.Close
Close #mlngFileNum
Command1.Enabled = True
Command2.Enabled = True
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim RevData() As Byte
Dim a() As Byte, b() As String, c() As String
Dim s As String, i As Long, k As Long
On Error GoTo fail
If mblnPutStart = False Then
Winsock1.PeekData RevData, vbArray Or vbByte
k = InStrB(1, RevData, ChrB(13) & ChrB(10) & ChrB(13) & ChrB(10))
If k > 0 Then
Winsock1.GetData RevData, vbArray Or vbByte
a = LeftB(RevData, k - 1)
RevData = MidB(RevData, k + 4)
s = StrConv(a, vbUnicode)
b = Split(s, vbCrLf)
If InStr(1, b(0), "200 OK", vbTextCompare) = 0 Then GoTo fail
For i = 1 To UBound(b)
c = Split(b(i), ": ")
Select Case c(0)
Case "Content-Length"
mlngFileLen = CLng(c(1))
Label1.Caption = "文件总字节:" & mlngFileLen
If mblnOnlyLen Then
CloseAll
Exit Sub
End If
End Select
Next
mblnPutStart = True
mlngCurByte = UBound(RevData) + 1
mlngFileNum = FreeFile
Open mstrFileName For Binary As #mlngFileNum
Else
Exit Sub
End If
Else
Winsock1.GetData RevData, vbArray Or vbByte
mlngCurByte = mlngCurByte + bytesTotal
End If
Put #mlngFileNum, , RevData
Label2.Caption = "已下载字节:" & mlngCurByte
If mlngCurByte = mlngFileLen Then
CloseAll
MsgBox "下载成功!"
End If
Exit Sub
fail:
CloseAll
MsgBox "网络传输错误,文件下载失败!"
End Sub
这个列子能不能改成FTp下载哦
http;//www.mndsoft.com/blog