用Winsock下载二进制文件时,怎样才知道文件已下载完了呢?

解决方案 »

  1.   

    Option Explicit
    '下载文件长度
    Private mFlen As Long
    Dim timeA As Long
    Dim ReceiveBytes As LongPrivate Sub Command1_Click()
        If Winsock1.State <> sckClosed Then   '如果Winsock1当前状态非关闭
            Winsock1.Close                    '关闭连接
        End If
        Winsock1.RemoteHost = "61.159.186.139"      '服务器地址
        Winsock1.RemotePort = 80            '服务器端口
        Winsock1.Connect                      '连接
        'Text2.Text = "开始联接..." & vbCrLf
        'Timer1.Enabled = True
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Winsock1.Close   '关闭连接
    End SubPrivate Sub Winsock1_Close()
        Winsock1.Close   '关闭连接
        Label3 = "关闭了"
    End SubPrivate Sub Winsock1_Connect() '当一个 Connect 操作完成时发生
    Dim strWebPage As StringstrWebPage = "/download2/少林传奇/少林传奇wz.exe" '要下载的文件 'http://61.159.186.139/download2/少林传奇/少林传奇wz.exe
    strWebPage = "GET " + strWebPage + " HTTP/1.0" + vbCrLf '        'GET 为FTP命令 取得文件
    'Getstr = Getstr & "Range: bytes=" & ReceiveBytes & "-" & vbCrLf
    strWebPage = strWebPage + vbCrLf '记住一定要加上vbCrLf
    Winsock1.SendData strWebPage '给远程计算机发送数据
    End Sub
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
        Dim TheFile() As Byte                    '接受数据的数组
        ReDim TheFile(bytesTotal)                '重定义数组下界
        Static YNLen As Boolean                  '是否接收了文件长度
        '接收到的下载数据(字符串类型)
        Dim ReceiveData As String
        Dim i As Long
        Dim StartPos As Long
        Winsock1.GetData TheFile                 '将接收的数据保存到数组If Not YNLen Then
        ReceiveData = ReceiveData & StrConv(TheFile, vbUnicode)
        Debug.Print ReceiveData
        If (InStr(1, ReceiveData, "HTTP/1.0 200 OK") Or InStr(1, ReceiveData, "HTTP/1.1 200 OK")) Then '表示请求下载文件成功
            Debug.Print "接联成功..."
        ElseIf (InStr(1, ReceiveData, "HTTP/1.0 404 ") Or InStr(1, ReceiveData, "HTTP/1.1 404")) Then  '表示服务器未找到请求的资源
            Debug.Print "没有找到相关文件..."
            Exit Sub
        Else '请求错误
            MsgBox "出错了"
            Exit Sub
        End If
        '如果服务器响应的字符串有指定文件大小的标题字段,取得文件大小
        If InStr(1, ReceiveData, "Content-Length:") > 0 And mFlen = 0 Then
           Dim pos1 As Long, pos2 As Long
           pos1 = InStr(1, ReceiveData, "Content-Length:")
           pos2 = InStr(pos1 + 16, ReceiveData, vbCrLf)
            If pos2 > pos1 Then
                mFlen = Mid(ReceiveData, pos1 + 16, pos2 - pos1 - 16)
                
                YNLen = True
                'Open "d:\1.ini" For Binary As #1    '打开文件
                Open "c:\ddd.exe" For Binary Lock Write As #1
                Debug.Print "开始接收数据..."
                Debug.Print "文件大小:" & mFlen
            End If
                    For i = 0 To UBound(TheFile) - 3
                        If TheFile(i) = 13 And TheFile(i + 1) = 10 And TheFile(i + 2) = 13 And TheFile(i + 3) = 10 Then
                            StartPos = i + 4
                            Exit For
                        End If
                    Next i
                    For i = StartPos To UBound(TheFile())
                        Put #1, , TheFile(i)
                    Next i
                    ReceiveBytes = Seek(1)
         End If
            
            ProgressBar1.Max = mFlen + 1 '设置进度条最大值
            ProgressBar1.Min = 0           '设置进度条最小值
            Label5 = Format$(mFlen / 1024 / 1024, "0.00")
    Else
            ReceiveBytes = ReceiveBytes + bytesTotal
            Put #1, , TheFile                '将接收的数据包写入该文件
            ProgressBar1.Value = ReceiveBytes '接收文件进度
            If ReceiveBytes >= mFlen Then Close #1: MsgBox "下载完成..."
    End If
    Label3 = bytesTotal
    Label4 = Format$(ReceiveBytes / 1024 / 1024, "0.00")End Sub
    Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
        MsgBox Description, vbInformation, "错误号:" & Number   '出错提示
        Winsock1.Close   '关闭连接
    End Sub源程序