Det finns många sätt att hantera nätverk med hjälp av VB. Ett av de enklaste sätten är att använda sig av Inet kontrollen som kapslar HTTP och FTP protokollen.
Det kan kanske kännas onödigt att skriva egna program för hantering av dessa protokoll eftersom man oftast använder HTTP i en browser, och det dessutom finns färdiga FTP program att ladda ner från Internet. Det har dock visat sig att man kan behöva dessa.
För att använda Inet kontrollen måste man välja Projekt, Components menyn eller högerklicka på toolboxen (som oftast finns längst till vänster i VB:s miljö). I listan som kommer skall man välja ("kruxa för") Microsoft Internet Transfer Control X.0, där X är 5 för VB 5.0 och 6 för VB 6.0. I toolboxen kommer då en ny Inet komponent som ser ut som en liten jordglob med en dator framför sig. Om ni använder en miljö där inte kontroller kan användas direkt kan ni använda er av
Set objekt = CreateObject("InetCtls.Inet.1") för att få tillgång till Intekontrollens funktionalitet. I ASP används
Set objekt = Server.CreateObject("InetCtls.Inet.1")
I alla exempel antas att ni har en Inet kontroll placerad på formen och att den heter Inet1.
Inet kontrollens properties (jag tar bara upp de egenskaper som är unika för denna typ av kontroll, bland annat Name och Index som finns för de flesta kontrolltyper tas inte upp):
| Property |
Giltiga värden |
Användning |
|
AccessType
läs och skrivbar |
0 icUseDefault 1 icDirect 2 icNamedProxy |
Används för att bestämma det skall användas en proxy. icDefault (eller 0) betyder att de inställningar som finns inställda i Internet inställningarna i Control Panel skall användas, icDirect (1) betyder att ingen proxy skall användas och icNamedProxy betyder att man skall använda en proxy oavsätt systemts inställningar. Om man anger icNamedProxy måste även Proxy propertyn ställas in. Oftast funkar det utan proxy, varför man inte behöver abvända denna property. |
|
Document
|
en path och filnamn. t.ex "samples/test.htm"
|
URL propertyn kan ange en komplett sökväg till en fil, t.ex. Inet1.URL = "http://www.site.fi/test/fil.htm". Om man vill kan man dela upp detta som: Inet1.URL = "http://www.site.fi" Inet1.Document = "test/fil.htm". Se även URL propertyn |
|
hInternet
endast läsbar |
|
Används för att få en internet handle. Används ionte i VB men kan behövas för internet API anrop |
| Password |
Ett lösenord. tex. "hemligt" |
Används tillsammans med UserName propertyn för FTP. Det finns två typer av FTP access: 1. Anonym Inet1.UserName = "anonymous" Inet1.Password = "användarens email adress" Personlig: Inet1.Password = "ditt lösenord" Inet1.UserName = "ditt användarnamn" |
| Protocol |
icUnknown (0) icDefault (1) icFTP (2) icReserved (3) icHTTP (4) icHTTPS (5)
|
Oftast anges protokollet i URL:n henom att börja med "http://" eller "ftp://". Maqn kan dock ange detta separat. Om man gör det kommer URL att ändras enligt det nya protolollet. T.ex Inet1.URL = "http://www.site.com/" Inet1.Protocol = icFTP MsgBox Inet1.URL ' kommer att visa "ftp://www.site.com" (https är secure http ifall ni inte visste det...) |
| Proxy |
ftp=proxy:port http=proxy:port proxy:port ftp=proxy:port http=proxy:port |
För att ange vilken proxy som skall användas. Om man inte anger ftp= eller http= kommer proxyna att använad för både http och ftp Exempel: Inet1.Proxy = "ftp=ftpProxy:123 HTTP=httpProxy:131" Används med AccessType propertyn |
| RemoteHost |
ett host namn t.ex bet.puv.fi |
Om man ändrar på denna property efter att ha satt URL propertyn kommer denna att ändras så att den avspeglar den nya hosten |
| RemotePort |
Ett TCP/IP portnummer |
Om man inte anger detta kommer port 80 att användas för HTTP och port 21 att användas för FTP. OM ni brukar annvända adreser av typen: "http://ww..site.com:8080" så betyder detta: Inet1.URL = "http://ww..site.com" Inet1.Port = 8080 |
| RequestTimeout |
Tid i sekunder tills en Time Out skall ske. 0 betyder oändligt (dålig idé) |
Om ni ofta använder en "trög" sderver kan ni kanske prova med lite olika tal här... |
ResponseCode endat läsbar |
|
Sker endast om StateChanges händelsen ger icError (11) som status. Använd ResponseInfo för beskricning av felet |
ResponseInfo endats läsbar |
|
Se ResponseCode |
StillExecuting endast läsbar |
|
Används för att kontrollera om Inet kontrollen fortfarande håller på och utför en överföring |
| URL |
En URL t.ex. "ftp://ftpserver.com/" eller
| Anger URL ("internet adressen") som skall användas. Se även: Document, Protocol, Proxy, RemoteHost och RemotePort |
| UserName |
användarnamn (i FTP) |
Se Password propertyn för beskrivning |
Inet kontrollens Metoder:
| Metod |
Returvärde |
Användning |
| Cancel |
inget |
Avbryter transfern och bryter förbindelsen |
| Execute |
inget |
Utför kommandon. Se separat beskrivning nedan |
| GetChunk |
datat som sänds från servern |
Se beskrivningen för execute nedan |
| GetHeader |
header data |
Inet1.getHeader returnera hela headern som sänds av servern. Man kan även ange vilken header man är intresserad av. Se nedan... |
| OpenURL |
datat som returneras |
Används för att direkt hämta datat. Kan vara en dålig idé. Se nedan |
Events:
| Event |
När sker den |
Användning |
| StateChanged |
När någontin har hänt i överföringen |
Används tillsammans med Execute metoden. |
| |
|
|
| Syntax: Inet1_StateChanged(ByVal State As Integer) |
| Möjliga värden på State parametern |
| Konstant |
Värde |
När? |
| icNone |
0 |
Inget att rapportera |
| icHostResolvingHost |
1 |
Kontrollen slår upp IP adressen för en URL. Observera att detta bara behöver ske en gång. Laddar ni ner samma sida många gånger efter varandra sker detta bara första gången |
| icHostResolved |
2 |
Kontrollen har fåttIP adressen för URL:n |
| icConnecting |
3 |
Kontrollen kontaktar server datorn... |
| icConnected |
4 |
... och har fått kontakt |
| icRequesting |
5 |
En förfrågan sker till servern... |
| icRequestSent |
6 |
...och har lyckats sända denna. |
| icReceivingResponse |
7 |
Kontrollen får data från servern. Observera att detta inte behöver vara det data som frågats efter, utad netta kan t.ex vara en cookie. |
| icResponseReceived |
8 |
Har fått ovsntående data. |
| icDisconnecting |
9 |
Kontrollen börjar bryta förbindelsen... |
| icDisconnected |
10 |
...och är här färdig med detta. |
| icError |
11 |
Hups! Någonting har gått snett. Använd ResponseCode och ResponseInfo för att få veta vad. |
| icResponseCompleted |
12 |
Nu har vi fått allt vi frågade efter. |
I praktiken HTTP
För att överföra data över Internet med hjälp av Inet kontrollen så används antingen OpenURL eller Execute. Den enklaste (men kanske inte alltid bästa) metoden är OpenURL som fungerar som följer:
Metod: OpenUrl
Syntax: returvariabel = Inet1.OpenUrl( url [,datatyp] )
och datatyp kan vara något av följande:
icString (0 - default): OpenURL returnerar en text. Tex. en html fil eller en textfil
icByteArray (1): OpenURL returnerar binär tdata, t.ex en exe, eller gif fil.
Om vi är säkra på att det är en textfil kan vi använda Inet kontrollen på följande sätt:
Private Sub Command1_Click()
Dim Resultat As Variant
Resultat = Inet1.OpenURL("http://www.site.com/fil.htm")
' och sen så gör vi någonting av innehållet i
' resultat variabeln
' för exemplets skull sparar jag i en fil
Open "C:\Temp\test.txt" For Output As #1
Print #1 , Resultat
Close #1
End Sub
Och om vi är säkra på att datat är binärt (exe, zip jpeg eller liknande) kan vi även göra på detta sätt:
Private Sub Command1_Click()
Dim resultat() As Byte ' observera att vi måste använda en array
Resultat() = Inet1.OpenURL("http://www.site.com/test.zip", _
icByteArray)
' och sen så gör vi någonting av innehållet i
' resultat variabeln
' för exemplets skull sparar jag i en fil
Open "C:\Temp\test.zip" For Binary Access Write As #1
Put #1, , Resultat()
Close #1
End Sub
Problemet med OpenURL är att vi bara sparkar igång en nedladdnin och har ingen koll på vad som sker. Vi har inte heller någon möjlighet att kontrollera typen av data i förväg. Vi har inte heller någon möjlighet att utföra någonting annat än en simpel "download"...
Private Sub Command1_Click()
If Inet1.StillExecuting Then
Inet1.Cancel
End If
Inet1.URL = Text1.Text
Inet1.Execute Inet1.URL, "GET"
Do While Inet1.StillExecuting
DoEvents
Loop
End Sub
Private Sub Inet1_StateChanged(ByVal State As Integer)
Dim theResponseType As String
Dim strData As String
Dim vtData As Variant
Dim vtDataTmp As Variant
Dim byteData() As Byte
Dim saveFile As String
Select Case State
' allt data finns tillgängligt
Case icResponseCompleted
' vad har vi fått för typ av fil?
theResponseType = Inet1.GetHeader("Content-type")
' kolla filnamnet
saveFile = ReverseSpanExcluding(Inet1.Document, "/")
' om man inte anger filnamn utan para katalog får man en default fil
' i så fall är inte Inet1.Document satt utan vi måste kolla
' If Len(saveFile) = 0 Then
saveFile = ReverseSpanExcluding( _
Inet1.GetHeader("Content-location"), "/")
End If
Select Case theResponseType
' Case "text/plain", "text/html"
vtData = Inet1.GetChunk(1024, icString)
Do While LenB(vtData) > 0
strData = strData & vtData
vtData = Inet1.GetChunk(1024, icString)
Loop
' gör något med datat. I detta fall en lagring
Open "C:\" & saveFile For Output As #1
Print #1, strData
Close #1
Case Else
' binärt data ?
vtData = Inet1.GetChunk(1024, icByteArray)
Do While LenB(vtData) > 0
vtDataTmp = vtDataTmp & vtData
vtData = Inet1.GetChunk(1024, icByteArray)
Loop
byteData = vtDataTmp
Open "C:\" & saveFile For Binary Access Write As #1
Put #1, , byteData
Close #1
End Select
Case Else
' här borde väl minst icError (11) kollas
End Select
End Sub
' några stödfunktioner...
Function ReverseSpanExcluding(S, sSök)
S = Reverse(S)
If Len(S) = 0 Then
ReverseSpanExcluding = Empty
Else
ReverseSpanExcluding = Reverse(Left$(S, InStr(1, S, sSök) - 1))
End If
End Function
Function Reverse(ByVal sSträng)
Dim sRev As String
Dim iVarv As Integer
sRev = ""
For iVarv = Len(sSträng) To 1 Step -1
sRev = sRev + Mid(sSträng, iVarv, 1)
Next iVarv
Reverse = sRev
End Function
Vill ni veta mer kan ni till exempel söka fram artikel Q229666 i Microsofts Knowledge Base.
Följande Internet artiklar kan vara skäl att läsa:
http://www.microsoft.com/mind/0396/wininet/wininet.htm
http://msdn.microsoft.com/library/periodic/period98/ivb0698.htm