基于HTTP协议用WinSock实现任意文件下载

下载

HTTP协议是文本格式通讯,下载文件是二进制数据,怎样处理好两种格式,而不受VB独断专行的Unicode转换影响,本代码提供了一个示例。

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 Boolean
Private Sub Form_Load()
    strURL = Text1.Text '准备下载的文件URL
    mstrFileName = Text2.Text   '下载文件在本存放的位置与文件名
    Label1.Caption = "文件总字节:0"
    Label2.Caption = "已下载字节:0"
    Command1.Caption = "开始下载"
    Command2.Caption = "取得长度"
End Sub
Private Sub Command1_Click()
    mblnOnlyLen = False
    DownFile
End Sub
Private Sub Command2_Click()
    mblnOnlyLen = True
    Label1.Caption = "文件总字节:0"
    DownFile
End Sub
Private 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 Sub

Private 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 Sub
Private Sub CloseAll()
    If Winsock1.State <> sckClosed Then Winsock1.Close
    Close #mlngFileNum
    Command1.Enabled = True
    Command2.Enabled = True
End Sub
Private 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

时间: 2024-10-08 09:25:23

基于HTTP协议用WinSock实现任意文件下载的相关文章

我的Android进阶之旅------&amp;gt;Android基于HTTP协议的多线程断点下载器的实现

一.首先写这篇文章之前,要了解实现该Android多线程断点下载器的几个知识点  1.多线程下载的原理,如下图所示 注意:由于Android移动设备和PC机的处理器还是不能相比,所以开辟的子线程建议不要多于5条.当然现在某些高端机子的处理器能力比较强了,就可以多开辟几条子线程. 2.为了实现断点下载,采用数据库方式记录下载的进度,这样当你将该应用退出后,下次点击下载的时候,程序会去查看该下载链接是否存在下载记录,如果存在下载记录就会判断下载的进度,如何从上次下载的进度继续开始下载. 3.特别注意

snmp-有没有基于SNMP协议对网络设备及服务器进行监控的软件呢?

问题描述 有没有基于SNMP协议对网络设备及服务器进行监控的软件呢? 对服务器及网络设备的流量.硬件信息等进行监控并报警的监控软件 解决方案 ActiveSnmpNet-snmp等都是相关的客户端可以查看

用C#实现基于TCP协议的网络通讯

网络 TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序. 要进行基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分--主机名和端口,如www.yesky.c

用C#实现基于用C#实现基于TCP协议的网络通讯

网络 TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序. 要进行基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分--主机名和端口,如www.yesky.c

ISA2006如何配置基于PPTP协议VPN

在企业应用中,VPN应该是用的最多的一种.特别是在公司拥有分部的情况下,可见VPN在企业中的应用是多么的广泛.当然,实现VPN的功能的方式有很多,公司可以购买VPN硬件设备,也可以使用专门的Cisco路由器来实现这特有的功能.在中小型企业里,源于资金的考虑,更多的可能会使用基于软件的VPN功能.(PS:若不是朋友要求,我想本文可能就没有了...呵呵呵) 现在我们来看看如何来配置ISA VPN,以及如何来配置基于L2TP的VPN功能(高安全性) 环境描述: 我们就以为例吧!一个VPN客户端希望通过

udp-需要一个java基于UDP协议的文件传输程序

问题描述 需要一个java基于UDP协议的文件传输程序 文件是一个实验数据的文件,是txt个格式的,需要将它传输到指定的IP上 解决方案 server package com.way.server;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundEx

大型分布式网站架构设计与实践 第一章《面向服务的体系架构(SOA)》1.1基于TCP协议的RPC

1.1基于TCP协议的RPC 1.1.1RPC名词理解 RPC的全称是Remote Process Call,即远程过程调用,它应用广泛,实现方式也很多,拥有RMI,WebService等诸多成熟的方案,在业界得到了广泛的应用.单台服务器的处理能力受硬件成本的限制,不可能无限制的提升,RPC将原来的本地调用转变为调用远端的服务器上的方法,给系统的处理能力和吞吐量带来了近乎无限制的提升,这是系统发展到一定阶段必然性的改革,也是实现分布式计算的基础. 如图1-2所示,RPC的实现包括客户端和服务端,

tcp-C# 如何使用socket实现基于TCP协议传输数据

问题描述 C# 如何使用socket实现基于TCP协议传输数据 我使用Socket.Send和Socket.BeginReceive完成了上位机通讯软件的编写,但是连接下位机经过分析抓包软件得到的数据包,发现似乎与标准TCP协议有出入.具体来讲是这样的: 首先根据TCP协议,数据交换的规范应该是这样的http://blog.csdn.net/moonhnney/article/details/5604677 数据交换: a ---->b a 发送数据完毕,(PSH,ACK) aseq = x,a

java web基于snmp协议的局域网远程电源管理系统

问题描述 java web基于snmp协议的局域网远程电源管理系统 5C 准备通过java web做基于snmp协议的局域网远程电源管理系统,(学校机房有3层,1200台电脑以上)以下是我的想法,请各位指导提建议哈,在此感谢呀 通过mib borwer收集第三方电源有关的mib库,保存到枚举,集合或xml中 遍历mib库,遍历电脑ip,管理端通过snmp的get获取agent端电源有关信息,进行数据的处理然后保存到db(通过异步,队列,多线程或分批方式定时获取) 设置报警阈值,agent端定时t