Visual Basic World - Programmierung und BeispieleVisual Basic World - Tipps und TutorialsVisual Basic World - Source-Code und Forum

<leer>

Tipp 051: Datei aus dem Internet herunterladen (html, zip, etc.)

Autor: Alexander Kopatz   VB-Version: Visual Basic 6.0   Download: Beispielprojekt Tipp-051

Beschreibung

Mit dem eigenen Programm eine Datei aus dem Internet zu laden kann aus den verschiedensten Gründen hilfreich sein. Zur Realisierung ein automatischen Update-Funktion, um News-Meldungen oder Einstellungen zu laden oder eine Datenbank zu aktualisieren, die Einsatzmöglichkeiten sind vielfältig. Ebenso variantenreich sind auch die möglichen Lösungsansätze für diese Aufgabe. So ließe sich etwa das Inet-Steuerelement verwenden oder eine API-Funktion bemühen. Eine der einfachsten, aber mit Sicherheit die schönste Methode in Visual Basic eine Datei aus dem Internet herunterzuladen ist die Verwendung des Winsock-Steuerelements.

Internet-Know-How und Winsock-Steuerelement

Zur Verwendung des Winsock-Steuerelements sind einige grundlegende Kenntnisse über die Kommunikation im Internet hilfreich. Grundsätzlich unterteilt sich die Kommunikation im Internet in verschiedene technische Ebenen, sogenannte Schichten. Dies beginnt bei den untersten Schichten auf Hardware- und Treiber-Ebene (Bitübertragung) und erstreckt sich über Vermittlungs- und Transportebene (IP, TCP, UDP) bis auf Anwendungsebene (bspw. HTTP). Die untersten Schichten dieser Implementierung sind für den Visual Basic Programmierer in der Regel verborgen und auch nur teilweise von Interesse. Vereinfacht lässt sich sagen: Sämtliche Rechner im Internet sind über eine sog. IP-Adresse (IP4 oder IP6) erreichbar und miteinander verbunden. Mit Hilfe eines Protokolls wie dem TCP (Transfer Control Protocol) oder UDP (User Datagram Protocol) ist es nunmehr möglich zwischen verschiedenen dieser Computer eine Datenübertragung zu initialisieren. Dieser auf technischer Ebene hochkomplexe Vorgang wird durch das Winsock-Steuerelement erheblich vereinfacht. Winsock steht dabei für Windows Sockets und kapselt die bereits in der Windows API implementierten Netzwerkfunktionen für den VB-Programmierer in einem handlichen Steuerelement. Insofern ist zur Umsetzung des folgenden Beispiels lediglich ein basales Verständnis des TCP-Protokolls erforderlich, welches im Internet überwiegend Verwendung findet.

TCP und HTTP

Um also eine Datei aus dem Internet zu laden ist es zunächst erforderlich eine Verbindung zu jenem Server aufzubauen, auf dem sich die zu ladende Datei befindet. Hierzu ist es in aller Regel von Nöten die IP-Adresse des entsprechenden Servers zu kennen (bspw. 193.99.144.80). Dankenswerterweise nimmt uns das Winsock-Control auch hier Arbeit ab, denn es akzeptiert auch Hostnamen die noch nicht aufgelöst wurden, wie etwa "visualbasicworld.de" und sorgt selbst dafür die entsprechende IP-Adresse in Erfahrung zu bringen. Somit kann aus einer bekannten URL direkt die Domainadresse als Server-Adresse verwendet werden. Sodann wird eine TCP-Verbindung zum Server hergestellt. Sobald dies geschehen ist sind nur noch einige Zeilen HTTP-Anweisungen erforderlich:

GET http://www.visualbasicworld.de/index.html HTTP/1.1
Host: www.visualbasicworld.de
User-Agent: Visual Basic World (http://www.visualbasicworld.de)
Connection: Close
Accept: */*

Die GET-Anweisung in Kombination mit den angegebenen Informationen beutet dem Server im Wesentlichen folgendes. Wir (Client) möchten von dir (Server) von der Domain (Host) die Seite (index.html). Die Übrigen Angaben geben Auskunft über uns (User-Agent) und darüber, dass die Verbindung nach der Übertragung geschlossen werden soll. Ferner akzeptiert unser Programm-Client sämtliche Dateitypen. Sobald die ersten Daten eintreffen wird das DataArrival-Event des Winsock-Controls ausgelöst und die empfangenen Daten in der entsprechenden TextBox auf der Form gespeichert. Zu Beginn der Empfangenen Daten steht eine HTTP-Statusmeldung der Art:

HTTP/1.1 200 OK
Date: Tue, 19 Feb 2013 18:28:36 GMT
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r
Last-Modified: Wed, 09 Jan 2013 19:45:36 GMT
ETag: "238d024-3598-4d2e04e673766"
Accept-Ranges: bytes
Content-Length: 13720
Connection: close
Content-Type: text/html

Sofern wir hier in der ersten Zeile ein " HTTP/1.1 200 OK" erhalten, wurde die Datei auf dem Server gefunden und es kann mit einer erfolgreichen Übertragung gerechnet werden. Sollte die Datei nicht gefunden werden oder unter einer anderen Adresse lagern würde uns der Webserver dies ebenfalls mitteilen. Zur endgültigen Weiterverarbeitung der Daten sollte dieser Teil der Übertragung entfernt werden, er endet mit einem doppelten Zeilenumbruch.

Zusatzinformationen

» Tipp 052: URL in einzelne Bestandteile zerlegen [splitten]

Quellcode

frmInternet
CommandButton            cmdGet
Form                     frmInternet
Label                    Label1
TextBox                  txtData
TextBox                  txtURL
' VISUAL BASIC WORLD
' ===========================================
' Das große Portal zum Thema Visual Basic.
'
' Wenn Ihnen dieser Source Code gefallen hat,
' dann empfehlen Sie Visual Basic World bitte
' weiter und/oder setzen Sie einen Link auf:
'
' http://www.visualbasicworld.de/
'
' Vernetzen Sie sich mit uns:
'
' http://twitter.com/visualbasicwrld

Option Explicit
Private Sub cmdGet_Click() If Left(txtURL.Text, 7) = "http://" Then Winsock.RemoteHost = GetHostName(txtURL.Text) Winsock.RemotePort = 80 Winsock.Connect 'Hier baut das Programm eine Verbindung zum gewählten Web-Server auf. 'Webserver stellen Ihren Service üblicherweise auf Port 80 zur Verfügung, 'daher wird hier Port-Nummer 80 eingestellt. 'Bei der Verwendung in einem eigenen Programm sollten hier noch
'zusätzliche
Prüf-Abfragen implementiert werden um sicherzustellen,
'dass auch tatsächlich
eine gültige URL eingegeben wurde. Else MsgBox Prompt:="Bitte geben Sie eine komplette URL ein incl. " _ & """http://"".", Buttons:=vbExclamation + _ vbOKOnly, Title:="Achtung" End If End Sub
Private Sub Winsock_Connect() Dim strHeader As String strHeader = "GET " & txtURL.Text & " HTTP/1.1" & vbCrLf _ & "Host: " & Winsock.RemoteHost & vbCrLf _ & "User-Agent: Visual Basic World - Internet-Sample " _ & "(http://www.visualbasicworld.de)" & vbCrLf _ & "Connection: Close" & vbCrLf _ & "Accept: */*" & vbCrLf & vbCrLf Winsock.SendData strHeader 'Das Ereignis (Event) Connect des Winsock-Steuerelements wird ausgelöst, 'sobald eine Verbindung mit der Gegenstelle zustande gekommen ist. 'Daraufhin sendet das Programm eine HTTP-konforme Anfrage an den Webserver 'und fordert die Übertragung der gewünschten Datei an. End Sub
Private Sub Winsock_DataArrival(ByVal bytesTotal As Long) Dim strData As String Winsock.GetData strData, vbString txtData.Text = txtData.Text & strData 'Bei den ankommenden Daten handelt es sich um die vom Web-Server 'angeforderte Datei. Eine größere Datei wird in mehreren Stücken 'Übertragen und dann in der entsprechenden TextBox wieder 'zusammengesetzt. 'Hinweis: Die empfangenen Daten enthalten noch die der Datei 'voran gestellten Statusinformationen des Webservers. Diese 'sollten vor dem speichern der Daten in eine lokale Datei 'ausgefiltert werden, da diese sonst bspw. in einem Webbrowser 'ebenfalls angezeigt werden oder zu Fehlern führen können. End Sub
Private Function GetHostName(ByVal strTemp As String) 'Diese Funktion extrahiert auf rudimentäre Weise aus einer 'angegebenen URL den Webserver. Es findest jedoch keine inhaltliche 'Kontrolle statt, ob es sich bei den angegebenen Informationen um 'valide oder zulässige Daten handelt. Zur Verwendung in einer 'Produktiv-Applikation, in der Fehleingaben durch den Benutzer 'möglich sind, sollten daher zusätzliche Kontrollabfragen eingebaut 'werden. Dim lngZähler As Long strTemp = Mid(strTemp, 8) For lngZähler = 1 To Len(strTemp) If Mid(strTemp, lngZähler, 1) = "/" Then GetHostName = Left(strTemp, lngZähler - 1) Exit Function End If Next End Function

<leer> Aktuelle Seite Back To Top
Druckansicht | Feedback | Favoriten
Copyright © Visual Basic World, 2000-2022 | Kontakt | Impressum

Visual Basic World @ Twitter

Folgen Sie Visual Basic World!

Visual Basic World @ Twitter
Wenn Ihnen Visual Basic World gefällt, dann folgen Sie uns doch bei Twitter (@visualbasicwrld).
Vielen Dank!