Källkoden för /anders.enges/vb/inet.asp
<!--#include file="../inc/navstuff.asp" -->


<P>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. </P>
<P>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. </P>
<P>För att använda Inet kontrollen måste man välja <B><U>P</U>rojekt, C<U>o</U>mponents </B>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") <B>Microsoft Internet Transfer Control X.0</B>, där X är 5 för VB 5.0 och 6 för VB 6.0. I toolboxen kommer då en ny <B>Inet</B> 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 <BR>Set objekt = CreateObject("InetCtls.Inet.1") för att få tillgång till Intekontrollens funktionalitet. I ASP används <BR>Set objekt = Server.CreateObject("InetCtls.Inet.1") </P>
<P>I alla exempel antas att ni har en <B>Inet</B> kontroll placerad på formen och att den heter <B>Inet1</B>.</P>
<P><B>Inet kontrollens properties </B>(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):</P>
<TABLE border=1>

<TR>
<TD width="11%"><B>Property</B></TD>
<TD width="31%"><B>Giltiga värden</B></TD>
<TD width="58%"><B>Användning</B></TD></TR>
<TR vAlign=top>
<TD width="11%">
<P>AccessType</P>
<P>läs och skrivbar</P></TD>
<TD width="31%">
<P>0 icUseDefault<BR>1 icDirect<BR>2 icNamedProxy</P></TD>
<TD width="58%">Används för att bestämma det skall användas en proxy. <I>icDefault</I> (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 <I>icNamedProxy</I> 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.</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">
<P>Document</P>
<P> </P></TD>
<TD width="31%">en path och filnamn. t.ex <BR>"samples/test.htm" <BR></TD>
<TD width="58%">URL propertyn kan ange en komplett sökväg till en fil, t.ex. <BR>Inet1.URL = "http://www.site.fi/test/fil.htm".<BR>Om man vill kan man dela upp detta som:<BR>Inet1.URL = "http://www.site.fi" <BR>Inet1.Document = "test/fil.htm". <BR>Se även URL propertyn</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">
<P>hInternet</P>
<P>endast läsbar</P></TD>
<TD width="31%"> </TD>
<TD width="58%">Används för att få en internet handle. Används ionte i VB men kan behövas för internet API anrop</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">Password</TD>
<TD width="31%">Ett lösenord. tex. "hemligt"</TD>
<TD width="58%">Används tillsammans med UserName propertyn för FTP. Det finns två typer av FTP access: <BR>1. Anonym<BR>Inet1.UserName = "anonymous"<BR>Inet1.Password = "<I>användarens email adress</I>"<BR>Personlig:<BR>Inet1.Password = "<I>ditt lösenord</I>"<BR>Inet1.UserName = "<I>ditt användarnamn</I>" </TD></TR>
<TR vAlign=top align=left>
<TD width="11%">Protocol</TD>
<TD width="31%">icUnknown (0)<BR>icDefault (1)<BR>icFTP (2)<BR>icReserved (3)<BR>icHTTP (4)<BR>icHTTPS (5)<BR></TD>
<TD width="58%">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<BR>Inet1.URL = "http://www.site.com/" <BR>Inet1.Protocol = icFTP <BR>MsgBox Inet1.URL ' kommer att visa "ftp://www.site.com" <BR>(https är secure http ifall ni inte visste det...)</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">Proxy</TD>
<TD width="31%">ftp=<I>proxy</I>:<I>port</I><BR>http=<I>proxy</I>:<I>port</I><BR><I>proxy</I>:<I>port</I><BR>ftp=<I>proxy</I>:<I>port</I> http=<I>proxy</I>:<I>port</I></TD>
<TD width="58%">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<BR>Exempel:<BR>Inet1.Proxy = "ftp=ftpProxy:123 HTTP=httpProxy:131"<BR>Används med AccessType propertyn</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">RemoteHost</TD>
<TD width="31%">ett host namn t.ex bet.puv.fi</TD>
<TD width="58%">Om man ändrar på denna property efter att ha satt URL propertyn kommer denna att ändras så att den avspeglar den nya hosten</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">RemotePort</TD>
<TD width="31%">Ett TCP/IP portnummer</TD>
<TD width="58%">
<P>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:<BR>Inet1.URL = "http://ww..site.com"<BR>Inet1.Port = 8080</P></TD></TR>
<TR vAlign=top align=left>
<TD width="11%">RequestTimeout</TD>
<TD width="31%">Tid i sekunder tills en Time Out skall ske. 0 betyder oändligt (dålig idé)</TD>
<TD width="58%">Om ni ofta använder en "trög" sderver kan ni kanske prova med lite olika tal här...</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">ResponseCode<BR>endat läsbar</TD>
<TD width="31%"> </TD>
<TD width="58%">Sker endast om StateChanges händelsen ger icError (11) som status. Använd ResponseInfo för beskricning av felet</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">ResponseInfo<BR>endats läsbar</TD>
<TD width="31%"> </TD>
<TD width="58%">Se ResponseCode</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">StillExecuting<BR>endast läsbar</TD>
<TD width="31%"> </TD>
<TD width="58%">Används för att kontrollera om Inet kontrollen fortfarande håller på och utför en överföring</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">URL</TD>
<TD width="31%">En URL t.ex. <BR>"ftp://ftpserver.com/" eller<BR>
<TD width="58%">Anger URL ("internet adressen") som skall användas. Se även:<BR>Document, Protocol, Proxy, RemoteHost och RemotePort</TD></TR>
<TR vAlign=top align=left>
<TD width="11%">UserName</TD>
<TD width="31%">användarnamn (i FTP)</TD>
<TD width="58%">Se Password propertyn för beskrivning</TD></TR></TABLE>
<P><B>Inet kontrollens Metoder:</B></P>
<TABLE width="100%" border=1>

<TR>
<TD><B>Metod</B></TD>
<TD><B>Returvärde</B></TD>
<TD><B>Användning</B></TD></TR>
<TR>
<TD>Cancel</TD>
<TD>inget</TD>
<TD>Avbryter transfern och bryter förbindelsen</TD></TR>
<TR>
<TD>Execute</TD>
<TD>inget</TD>
<TD>Utför kommandon. Se separat beskrivning nedan</TD></TR>
<TR>
<TD>GetChunk</TD>
<TD>datat som sänds från servern</TD>
<TD vAlign=top>Se beskrivningen för execute nedan</TD></TR>
<TR>
<TD>GetHeader</TD>
<TD>header data</TD>
<TD vAlign=top>Inet1.getHeader returnera hela headern som sänds av servern. Man kan även ange vilken header man är intresserad av. Se nedan...</TD></TR>
<TR>
<TD>OpenURL</TD>
<TD>datat som returneras</TD>
<TD vAlign=top>Används för att direkt hämta datat. Kan vara en dålig idé. Se nedan</TD></TR></TABLE>
<P><B>Events:</B></P>
<TABLE width="100%" border=1>

<TR>
<TD><B>Event</B></TD>
<TD><B>När sker den</B></TD>
<TD vAlign=top><B>Användning</B></TD></TR>
<TR>
<TD>StateChanged </TD>
<TD>När någontin har hänt i överföringen</TD>
<TD vAlign=top>Används tillsammans med Execute metoden.</TD></TR>
<TR>
<TD> </TD>
<TD> </TD>
<TD vAlign=top> </TD></TR>
<TR>
<TD colSpan=3>Syntax: Inet1_StateChanged(ByVal State As Integer)</TD></TR>
<TR>
<TD colSpan=3>Möjliga värden på State parametern</TD></TR>
<TR>
<TD>Konstant</TD>
<TD>Värde</TD>
<TD vAlign=top>När?</TD></TR>
<TR>
<TD>icNone</TD>
<TD>0</TD>
<TD vAlign=top>Inget att rapportera</TD></TR>
<TR>
<TD vAlign=top>icHostResolvingHost</TD>
<TD vAlign=top>1</TD>
<TD vAlign=top>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</TD></TR>
<TR>
<TD vAlign=top>icHostResolved</TD>
<TD vAlign=top>2</TD>
<TD vAlign=top>Kontrollen har fåttIP adressen för URL:n</TD></TR>
<TR>
<TD vAlign=top>icConnecting</TD>
<TD vAlign=top>3</TD>
<TD vAlign=top>Kontrollen kontaktar server datorn...</TD></TR>
<TR>
<TD vAlign=top>icConnected</TD>
<TD vAlign=top>4</TD>
<TD vAlign=top>... och har fått kontakt</TD></TR>
<TR>
<TD vAlign=top>icRequesting</TD>
<TD vAlign=top>5</TD>
<TD vAlign=top>En förfrågan sker till servern...</TD></TR>
<TR>
<TD vAlign=top>icRequestSent</TD>
<TD vAlign=top>6</TD>
<TD vAlign=top>...och har lyckats sända denna.</TD></TR>
<TR>
<TD vAlign=top>icReceivingResponse</TD>
<TD vAlign=top>7</TD>
<TD vAlign=top>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.</TD></TR>
<TR>
<TD vAlign=top>icResponseReceived</TD>
<TD vAlign=top>8</TD>
<TD vAlign=top>Har fått ovsntående data.</TD></TR>
<TR>
<TD vAlign=top>icDisconnecting</TD>
<TD vAlign=top>9</TD>
<TD vAlign=top>Kontrollen börjar bryta förbindelsen...</TD></TR>
<TR>
<TD vAlign=top>icDisconnected</TD>
<TD vAlign=top>10</TD>
<TD vAlign=top>...och är här färdig med detta.</TD></TR>
<TR>
<TD vAlign=top>icError</TD>
<TD vAlign=top>11</TD>
<TD vAlign=top>Hups! Någonting har gått snett. Använd ResponseCode och ResponseInfo för att få veta vad.</TD></TR>
<TR>
<TD vAlign=top>icResponseCompleted</TD>
<TD vAlign=top>12</TD>
<TD vAlign=top>Nu har vi fått allt vi frågade efter.</TD></TR></TABLE>
<P> </P>
<H4>I praktiken HTTP</H4>
<P>För att överföra data över Internet med hjälp av Inet kontrollen så används antingen <B>OpenURL</B> eller <B>Execute</B>. Den enklaste (men kanske inte alltid bästa) metoden är OpenURL som fungerar som följer:</P>
<P>Metod: OpenUrl<BR>Syntax: returvariabel = Inet1.OpenUrl( <I>url</I> <I>[,datatyp]</I> ) <BR>och datatyp kan vara något av följande:<BR>icString (0 - default): OpenURL returnerar en text. Tex. en html fil eller en textfil<BR>icByteArray (1): OpenURL returnerar binär tdata, t.ex en exe, eller gif fil. <BR></P>
<P>Om vi är säkra på att det är en textfil kan vi använda Inet kontrollen på följande sätt:</P>
<DIV class=code>Private Sub Command1_Click()<BR>      Dim Resultat As Variant<BR>      Resultat = Inet1.OpenURL("http://www.site.com/fil.htm") <BR>      ' och sen så gör vi någonting av innehållet i <BR>      ' resultat variabeln<BR>      ' för exemplets skull sparar jag i en fil <BR>      Open "C:\Temp\test.txt" For Output As #1 <BR>      Print #1 , Resultat <BR>      Close #1 <BR>End Sub </DIV>
<P>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:</P>
<DIV class=code>Private Sub Command1_Click()<BR>      Dim resultat() As Byte ' observera att vi måste använda en array<BR>      Resultat() = Inet1.OpenURL("http://www.site.com/test.zip", _ <BR>                  icByteArray) <BR>      ' och sen så gör vi någonting av innehållet i <BR>      ' resultat variabeln<BR>      ' för exemplets skull sparar jag i en fil<BR>      Open "C:\Temp\test.zip" For Binary Access Write As #1 <BR>      Put #1, , Resultat() <BR>      Close #1 <BR>End Sub </DIV>
<P></P>
<P>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"...</P>
<DIV class=code>
<P> </P>
<P>Private Sub Command1_Click()<BR>      If Inet1.StillExecuting Then<BR>            Inet1.Cancel<BR>      End If<BR>      Inet1.URL = Text1.Text<BR>      Inet1.Execute Inet1.URL, "GET"<BR>      Do While Inet1.StillExecuting<BR>            DoEvents<BR>      Loop<BR>End Sub</P>
<P><BR>Private Sub Inet1_StateChanged(ByVal State As Integer)<BR>      Dim theResponseType As String<BR>      Dim strData As String<BR>      Dim vtData As Variant<BR>      Dim vtDataTmp As Variant<BR>      Dim byteData() As Byte<BR>      Dim saveFile As String<BR><BR>      Select Case State<BR>            ' allt data finns tillgängligt<BR>            Case icResponseCompleted<BR>                  ' vad har vi fått för typ av fil?<BR>                   theResponseType = Inet1.GetHeader("Content-type")<BR></P>
<P>                  ' kolla filnamnet<BR>                  saveFile = ReverseSpanExcluding(Inet1.Document, "/")<BR><BR>                  ' om man inte anger filnamn utan para katalog får man en default fil<BR>                  ' i så fall är inte Inet1.Document satt utan vi måste kolla<BR>                  '                   If Len(saveFile) = 0 Then<BR>                        saveFile = ReverseSpanExcluding( _ <BR>                                           Inet1.GetHeader("Content-location"), "/")<BR>                  End If<BR><BR>                  Select Case theResponseType<BR>                        '                          Case "text/plain", "text/html"<BR>                              vtData = Inet1.GetChunk(1024, icString)<BR>                              Do While LenB(vtData) > 0<BR>                                    strData = strData & vtData<BR>                                    vtData = Inet1.GetChunk(1024, icString)<BR>                              Loop<BR>                              ' gör något med datat. I detta fall en lagring<BR>                              Open "C:\" & saveFile For Output As #1<BR>                              Print #1, strData<BR>                              Close #1<BR>                        Case Else<BR>                              ' binärt data ?<BR>                              vtData = Inet1.GetChunk(1024, icByteArray)<BR>                              Do While LenB(vtData) > 0<BR>                                    vtDataTmp = vtDataTmp & vtData<BR>                                    vtData = Inet1.GetChunk(1024, icByteArray)<BR>                              Loop<BR>                              byteData = vtDataTmp<BR>                              Open "C:\" & saveFile For Binary Access Write As #1<BR>                              Put #1, , byteData<BR>                              Close #1<BR>                   End Select<BR>             Case Else<BR>                        ' här borde väl minst icError (11) kollas<BR>      End Select<BR>End Sub<BR></P>
<P>' några stödfunktioner...<BR>Function ReverseSpanExcluding(S, sSök)<BR>      S = Reverse(S)<BR>      If Len(S) = 0 Then<BR>            ReverseSpanExcluding = Empty<BR>      Else<BR>            ReverseSpanExcluding = Reverse(Left$(S, InStr(1, S, sSök) - 1))<BR>      End If<BR>End Function<BR></P>
<P>Function Reverse(ByVal sSträng)<BR>      Dim sRev As String<BR>      Dim iVarv As Integer<BR>      sRev = ""<BR>      For iVarv = Len(sSträng) To 1 Step -1<BR>            sRev = sRev + Mid(sSträng, iVarv, 1)<BR>      Next iVarv<BR>      Reverse = sRev<BR>End Function</P></DIV>
<P>
<P>Vill ni veta mer kan ni till exempel söka fram artikel Q229666 i Microsofts Knowledge Base.</P>
<P>Följande Internet artiklar kan vara skäl att läsa:<BR><A href="http://www.microsoft.com/mind/0396/wininet/wininet.htm">http://www.microsoft.com/mind/0396/wininet/wininet.htm<BR></A><A href="http://msdn.microsoft.com/library/periodic/period98/ivb0698.htm">http://msdn.microsoft.com/library/periodic/period98/ivb0698.htm</A><BR></P>

<!--#include file="../inc/footer.asp" -->