奇怪。受到下面数据后,如何继续接受图片呢?现在只能接收到HTTP信息头,无法接受文件内容?而且bytesTotal 的长度是头信息的长度,而不是文件长度。请问如何继续接收数据内容呢/?HTTP/1.0 200 OK
Content-Length: 6813
Content-Type: image/gif
Last-Modified: Mon, 04 Dec 2006 10:34:41 GMT
Accept-Ranges: bytes
ETag: "32cc86ce8f17c71:2bad"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Sun, 07 Jan 2007 09:23:53 GMT
Age: 100
X-Cache: HIT from longrujun.name
Via: 1.0 longrujun.name:80 (squid/2.6.STABLE5-20061211)
Connection: close------------------------------------
接受代码:Private Sub sk_DataArrival(Index As Integer, ByVal bytesTotal As Long) '收到数据触    Dim str As String, i As Integer, j As Integer
    Dim url As String, tmp As String
    ReDim byBuff(1 To bytesTotal) As Byte
    sk(0).getData byBuff, vbArray + vbByte
    Open "img.gif" For Binary As #1
    Put #1, , byBuff
    Close #1
end sub

解决方案 »

  1.   

    代码:private sub command1_click()
            HTTPHeader = "GET /images/smilies/wizenflower.gif HTTP/1.1" & vbCrLf & _
                         "Content-Type: text/html" & vbCrLf & _
                         "Host: www.vbgood.com" & vbCrLf & _
                         "Accept: text/html, */*" & vbCrLf & _
                         "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" & vbCrLf &  vbCrLf          socks.Connect "www.vbgood.com", "80"
    End SubPrivate Sub socks_Connect()
        socks.SendData HTTPHeader
    End Sub
      

  2.   

    代码:
    Private Sub Command3_Click()
    HTTPHeader = "GET /images/smilies/wizenflower.gif HTTP/1.1" & vbCrLf & _
                         "Content-Type: text/html" & vbCrLf & _
                         "Host: www.vbgood.com" & vbCrLf & _
                         "Accept: *.*, */*" & vbCrLf & _
                         "User-Agent: Conquest" & vbCrLf & vbCrLfsocks.Connect "www.vbgood.com", "80"
    End SubPrivate Sub socks_Connect()
    socks.SendData HTTPHeader
    End SubPrivate Sub socks_DataArrival(ByVal bytesTotal As Long)
    Dim da As String
    Dim daBytes() As Byte
    ReDim daBytes(bytesTotal - 1)
         socks.GetData da, vbString   '为了简化,采用的是vbstring,请自行改为以下
         'socks.GetData daBytes, vbByte
         Debug.Print da
    End Sub显示结果:
    HTTP/1.1 200 OK
    Date: Mon, 08 Jan 2007 12:22:02 GMT
    Server: Apache
    Last-Modified: Wed, 13 Dec 2006 13:17:41 GMT
    ETag: "16a39-13b9-39328740"
    Accept-Ranges: bytes
    Content-Length: 5049
    Content-Type: image/gif
    GIF87a       f 33f檉衊   fff??`p ?烫櫎畃€皜虁€犂犩怭癙P€?o    佬腊p @€@`€ p€ 33 @@ p噜郟怭噜惏愋嘈€行?  嗬?€ 欣鄍  PP悹` p 挐T` p跋胺緧i&0€0衟 @pp f 览犩嘈€怈`€袪犚赘Pp?p嘈邪f3蘤 喟€? p 鄍 袗?s p   烫??3嘈癅@ ppp? 邪? 0p?蘤f? €€?0P 3?繞@郹 ?p燻 € 燖酄`貈"泰炖戉€p 迴B?0`怈p爌 ?? 甙癙€ 3   惏€縛`? 牥€郟P佬?` 鄍 袄牥邪p怭? Z~!`嗬爌怈  €0€  P@酄€0@ 櫃繮 P?鄝0犂惏缾牥pp€0j牋嚙i繞 酄p0 郹衟喟?P @ 聐`€0P 纏纏p€?軏4爯€衻€袗€?p0P0`@@€ p ? 啗QW慒F_ 檉pP郟€@`P@3f ? 啞]郂@悾_e歎蠵 P??@0? @€? 蠤 郂 0€? 0? 綤€?? O?? /?p@? 蠵 蠤蠵衊`@@ 行? 癅 繮P;'繞繮@ P€纏P纏`镅肞  嗬班0 鄍0喟?€` ? I?V??蠵0怈郟 郹`諉Q?蹛R蠵Pp`蠤0荬愋00! NETSCAPE2.0   !?  ,          H盃羶*\劝∶?x8L€?"騺? 4i)ⅴ8AD h0!@K,?缆CnúP盇??霶`?瓒进` ~ 谩倻<HT豴   h爡&QZ笵D ??爡醽W?MhYQbE?h荬r冥$CCJ0??n心'?X?癧吤7 
    掖?晩%8p `坆廙84駦棑v霵p
    (略)
      

  3.   

    谢谢楼上2位,但是我是接受文件啊?如果小文件,可以接受,但是对于大文件,就接受不全。另一位朋友的答复:首先你要明白下载文件的过程机制。我这几天正在写WINSOCK,把我的经验告诉你吧。
    1、发送HTTP头:
    首先构建最简请求字符串:
    dim HTTPHeader as string
    HTTPHeader=""
    HTTPHeader=HTTPHeader & "GET /images/smilies/wizenflower.gif HTTP/1.1" & vbCrLf 
    HTTPHeader=HTTPHeader & "Host: www.vbgood.com" & vbCrLf & vbCrLf
    这样的头就可以了。然后发送请求:
    socks.Connect "www.vbgood.com", "80"然后在connet事件时:
    socks.SendData HTTPHeader2、接收数据
    这里是关键。服务器返回的数据有2部分组成。一部分是HTTP响应消息头,另一部分是你要下载的文件二进制数据。服务返回的数据不一定是几次,有可能一次,有可能二次,或者N次,而且响应消息头和返回的二进制数据不一定是分开的,有可能是一起返回,有可能第一次返回消息头,第二次返回二进制数据。服务器不同二不同。而且每次返回的数据大小最大是64KB,这是TCP包的最大尺寸。
    你接收不到文件的问题就是出在你只接在ARRIVAL事件收一次数据,这当然是不全的。你应该首先在响应头中查找content_lenth,确定返回的数据总大小。然后定义一个全程byte()字节数组变量,分多次接收返回的数据,用ubound(byte)判断是否已经接收完全。大概思路就是这样,废话不多说,给你我的代码,我已经测试通过。我写的是支持多线程(多winsock同时下载的代码),不懂的问。调用方法:在data_Arrival()中 
            Dim DataByte() As Byte  '用字节数组接受数据
            socks.GetData DataByte
            If SaveData(DataByte(), "wizenflower.gif", 0) = False Then '调用一个winsock(0)
               ...
            End If        If SaveData(DataByte(), "wizenflower.gif", 1) = False Then '再调用一个winsock(1)
               ...
            End If完整代码如下:
    '这是一个支持从网站以HTTP协议下载的模块,支持多线程(WINSOCK)模式。Private Arrival_First_Times() As Boolean    '数据第一次到达
    Private F_Num() As Integer '取得系统的空闲文件号
    Public File_Lenth() As String '待下载的文件大小
    Public Received_Byte() As Long '已接受字节Public Function SaveData(DataByte() As Byte, FileName As String, Pros_ID As Integer) As Boolean
    'DataByte():接收到的字节数组,FileName:要保存的文件名ros_ID:线程ID,支持多WINSOCK。'根据线程数定义动态数组的大小(保护原有数据模式)
    ReDim Preserve Arrival_First_Times(Pros_ID + 1)
    ReDim Preserve F_Num(Pros_ID + 1)
    ReDim Preserve File_Lenth(Pros_ID + 1)
    ReDim Preserve Received_Byte(Pros_ID + 1)On Error GoTo err
    If Arrival_First_Times(Pros_ID) = False Then '数据第一次到达的时候,包含消息头,也可能一起包括2进制文件:所以检查消息头,并分离数据        Dim DataStr As String
            DataStr = StrConv(DataByte(), vbUnicode) '这里是将字节数组转化为字符串,以便于操作
        
            If InStr(1, DataStr, "HTTP/1.1 200 OK") Or InStr(1, DataStr, "HTTP/1.0 200 OK") Then '检查http响应状态
                 '取得待下载的文件大小字节数
                 Dim pos1, pos2, Title_Lenth, Start_Pos
                 Title_Lenth = Len("Content-Length:")
                 pos1 = InStr(1, DataStr, "Content-Length:")
                 pos2 = InStr(pos1, DataStr, vbCrLf)
                 File_Lenth(Pros_ID) = Mid(DataStr, pos1 + Title_Lenth, pos2 - pos1 - Title_Lenth)
                 
                '从服务器返回的数据中,取得下载文件的起始位置。
                '说明:消息结束和文件结束的地方,分别用2个换行表示数据结束。一个换行vbcrlf占用2字节。
                '在字符串中,2个换行就是2个vbcrlf;而在字节数组中,就是连续的DataByte(i)=13,DataByte(i+1)=10,DataByte(i+2)=13,DataByte(i+3)=10
                
                 For i = 0 To UBound(DataByte()) - 3 '减3是因为文件的最后也是2个换行,而我们需要的是消息头和文件之间的分割,所以不搜索最后的那2次换行。
                     If DataByte(i) = 13 And DataByte(i + 1) = 10 And DataByte(i + 2) = 13 And DataByte(i + 3) = 10 Then
                     Start_Pos = i + 4 '加4是因为每个换行占用了2个字节,所以往后4个字节,正好是二进制数据开始的地方
                     Exit For
                     End If
                 Next
                 
                 '将第一次接受到的字节,除去HTTP响应标题以外的二进制数据,写入文件
                 If Dir(App.Path & "/" & FileName) <> "" Then '第一次写入文件,如果写入之前文件已存在,则删除。
                 Kill App.Path & "/" & FileName
                 End If
                 
                 F_Num(Pros_ID) = FreeFile()
                 Open App.Path & "/" & FileName For Binary Lock Write As #F_Num(Pros_ID)
                    For i = Start_Pos To UBound(DataByte())
                        Put #F_Num(Pros_ID), , DataByte(i)
                    Next
                 Close #F_Num(Pros_ID)
                 
                 Arrival_First_Times(Pros_ID) = True '已经完成第一批到达数据的处理。
                 
           Else
                SaveData = False
                Exit Function
           End If
           
           Received_Byte(Pros_ID) = Received_Byte(Pros_ID) + UBound(DataByte()) + 1 - Start_Pos
           
    Else '如果不是第一到达数据,则直接写入文件        F_Num(Pros_ID) = FreeFile()
            Open App.Path & "/" & FileName For Binary Lock Write As #F_Num(Pros_ID)
            If LOF(F_Num(Pros_ID)) > 0 Then Seek #F_Num(Pros_ID), LOF(F_Num(Pros_ID)) + 1
            Put #F_Num(Pros_ID), , DataByte()
            Close #F_Num(Pros_ID)        Received_Byte(Pros_ID) = Received_Byte(Pros_ID) + UBound(DataByte()) + 1
    End IfSaveData = True
    Exit Functionerr:
    SaveData = FalseEnd Function