Eseguire
una ricerca veloce nell' archivio delle risorse di Visual Basic
Italia®:
|
Preso
dall'archivio...
Premere il pulsante sotto per accedere direttamente ad un articolo
o ad un esempio preso in modo casuale dall'archivio.
|
Ultimo
e-book pubblicato:
"INTRODUZIONE
AI CSS"
Lo scopo del CSS language è quello di controllare lo
stile dei vari elementi che concorrono a formare un
documento HTML.
Si può operare in tre modi collegamento ad un foglio di stile
esterno;definizione degli stili all'inizio
del documento utilizzo della proprietà style all'interno
di un Tag HTML (embedded style). Questo e-book introduttivo
servirà per apprendere tali nozioni fondametali dei fogli
di stile.
Prezzo: € 0.0.
|
Contatti.
Utilizzare l'email generica per domande relative al sito:
oppure scrivere
ad un responsabile di area.
Responsabile
del sito: >Andrea
Martelli
Responsabile area "Corso di VB":
> Giorgio Abraini
|
|
|
|
|
| Visual
Basic ed il protocollo NNTP: creare un newsreader
(settima
parte) |
Una
volta incluso all'interno del progetto il controllo Winsock
trascinarlo sul piano di lavoro. E finalmente si arriva alla
funzione AttesaRisposta.
Per comprenderne ancora meglio il significato è necessario
aggiungere che la sua funzione non è solamente quella
di interrompere l'attesa di risposta del server delle news,
ma anche quella di bloccare temporaneamente l'applicazione nel
mezzo di un'operazione che di fatto sta compiendo.
In parole povere, si immagini di richiedere un'informazione
su un newsgroup da una sottoprocedura che, una volta ricevuta
la risposta la processa e la stampa a video in una casella di
testo. Senza la funzione AttesaRisposa() l'applicazione processerebbe
una risposta (variabile Risposta) che di fatto corrisoponde
ad una stringa vuota ("").
Questo perché, mentre l'applicazione che si sta sviluppando
passa velocemente da un'istruzione alla successiva, nel processo
di comunicazione client/server i tempi sono molto più
lunghi.
E' pertanto necessario impostare delle priorità ben definite:
verrà processata la risposta solamente quando la variabile
Risposta conterrà un valore differente dalla stringa
vuota.
Ciò non dà sicuramente adito ad errori: non accade
mai infatti, come si vedrà meglio nei capitoli successivi,
che la risposta dal server sia costituita soltanto da "".
VB.NET
'***********************************************************
' Attesa della risposta dal Server
'***********************************************************
1 Private Function AttesaRisposta()
As Boolean
2 Dim Inizio As
Double 'i millisecondi dalla
mezzanotte ad ora
3 Risposta = "" 'elimina
l'ultima risposta ricevuta dal server
4 Inizio = Microsoft.VisualBasic.Timer 'inizio
del conteggio del time-out
5 Do While Risposta = ""
And (Microsoft.VisualBasic.Timer
- Inizio) < TimeOut
6 Application.DoEvents()
7 Loop
8 If Risposta <> ""
Then
9 AttesaRisposta = True
10 Else
11 AttesaRisposta = False
12 AxWinsock1.Close()
13 MsgBox("Errore di time-out o mancata risposta
del server.", vbCritical)
14 End If
15 End Function |
VB6
'***********************************************************
' Attesa della risposta dal Server
'***********************************************************
1 Private Function AttesaRisposta()
As Boolean
2 Dim Inizio As
Double 'i millisecondi dalla
mezzanotte ad ora
3 Risposta = "" 'elimina
l'ultima risposta ricevuta dal server
4 Inizio = Timer 'inizio del conteggio
del time-out
5 Do While Risposta = ""
And (Timer - Inizio) <
TimeOut
6 DoEvents()
7 Loop
8 If Risposta <> ""
Then
9 AttesaRisposta = True
10 Else
11 AttesaRisposta = False
12 AxWinsock1.Close()
13 MsgBox("Errore di time-out o mancata risposta
del server.", vbCritical)
14 End If
15 End Function |
La riga 1 indica l'apertura della funzione che non necessita
di alcun parametro. Il valore ritornato dalla funzione è
invece booleano ed è impostato alle righe 8 e 9 su True
in caso di successo ossia se la risposta dal server è
positiva oppure su False se nel corso del tempo dall'avvio della
funzione al time-out la risposta non è ancora arrivata.
La riga 3 è utile per svuotare dalla variabile Risposta
la stringa di testo immagazzinata in un'eventuale precedente
richiamo della medesima funzione AttesaRisposta().
La riga 4 assegna alla variabile Inizio il numero di millisecondi
trascorsi dalla mezzanotte.
E' un utile metodo per assegnare un inizio che abbia una collocazione
ben precisa nel tempo.
Le righe 5, 6 e 7 costituiscono il cuore della funzione: l'applicazione
si bloccherà infatti in quelle tre righe di codice finchè
si verificheranno contemporaneamente due condizioni: la mancanza
di una risposta da parte del server ed il mancato raggiungimento
del tempo limite di attesa (il time-out).
Nel caso in cui non ci sia risposta entro il limite impostato,
verrà chiusa la connessione tramite la riga 12 e verrà
visualizzato un messaggio di errore dalla riga 13.
| La
porta di comunicazione |
Come già visto in precedenza la porta predefinita per
il protocollo NNTP è la 119.
Tale parametro pertanto potrebbe essere addirittura escluso
dalle scelte che si impongono all'utente prima della connessione.
Tuttavia per rendere le cose ancora più chiare si ripeteranno
le operazioni appena esaminate nei casi dei due valori precedenti
NomeServer e TimeOut e si andrà ad aggiungere a Modulo_Impostazioni.vb
la dichiarazione della variabile globale Porta.
Il modulo pertanto si presenterà con le seguenti tre
dichiarazioni:
VB.NET
Module Modulo_Impostazioni
'IMPOSTAZIONI PER LA CONNESSIONE AL
SERVER DELLE NEWS
Public NomeServer As
String 'il nome del server
delle news a cui connettersi
Public Porta As
Integer 'la porta destinata
alla comunicazione col server (predefinita la 119)
Public TimeOut As
Integer 'il tempo massimo di
attesa alla risposta del server
Public Risposta As
String 'la risposta in formato
testuale ricevuta dal server
End Module |
VB6
'IMPOSTAZIONI PER LA CONNESSIONE AL
SERVER DELLE NEWS
Public NomeServer As
String 'il nome del server
delle news a cui connettersi
Public Porta As
Integer 'la porta destinata
alla comunicazione col server (predefinita la 119)
Public TimeOut As
Integer 'il tempo massimo di
attesa alla risposta del server
Public Risposta As
String 'la risposta in formato
testuale ricevuta dal server |
Si ripete anche per la variabile Porta il controllo della corretta
impostazione all'interno dell'evento btnConnessione_Click:
VB.NET
e VB6
'controllo dell'impostazione della porta di comunicazione
da parte dell'utente
If Len(txtPorta.Text) = 0
Or Trim(txtPorta.Text) =
"" Then
MsgBox("La porta di comunicazione non è valida"
& vbCrLf _
& "e verrà pertanto scelta la 119.")
Porta = 119
Else
'una volta passato il controllo viene
assegnato alla variabile il valore della casella di testo
Porta = CInt(txtPorta.Text)
End If |
Si può facilmente notare che il messaggio di errore non
porta all'annullamento della procedura di connessione: non è
prevista infatti l'istruzione Exit Sub. Questo perché
la variabile Porta verrà impostata sul valore predefinito
119 in caso di mancata definizione da parte dell'utente.
La funzione Cint che racchiude il valore della casella di testo
txtPorta non serve altro che a trasformare in un intero il contenuto
della TextBox che originariamente è in formato di testo
e pertanto non adatto ad essere memorizzato all'interno di una
variabile Integer com'è invece Porta.
Un capitolo molto importante e da studiare attentamente è
questo sulle risposte che vengono inviate dal server all'applicazione
client.
In particolare è necessario comprendere la classificazione
nella quale è possibile suddividerle e che prevede la
distinzione tra risposte testuali e di stato.
Le risposte testuali consistono in una o più linee di
testo precedute da un una risposta di stato che anticipa le
informazioni inviate.
Ad esempio, anticipando ciò che verrà nei prossimi
capitoli, se si vuole ottenere dal server delle news il testo
di un articolo con un determinato numero che lo identifica,
come ad esempio l'articolo 219512, si possono ottenere varie
risposte.
Quella che identifica il successo nel recupero del corpo dell'articolo
specificato è la seguente:
222
219512 article retrieved - body follows -> risposta
di stato
<corpo dell'articolo>
<corpo dell'articolo> -> risposta di testo
<..>
<..>
<corpo dell'articolo>
.
|
Questa risposta indica in generale che l'articolo è stato
trovato nel database e che il testo che segue ne rappresenta
proprio il corpo ossia quello che viene definito BODY.
Ma per un'analisi ancora più dettagliata si proverà
a scomporre la risposta di stato di questo esempio nelle varie
parti che lo costituiscono:
222 indica il codice della risposta: una risposta positiva alla
richiesta dell'invio del BODY avrà sempre questo codice.
Come si vedrà successivamente tale codice risulta davvero
molto utile per determinare se l'applicazione client può
procedere al parsing della risposta o se è necessario
bloccarsi a causa di un errore.
219512 rappresenta l'intero identificativo dell'articolo del
quale è stato richiesto il corpo.
article retrieved rappresenta in forma testuale ciò che
il codice 222 ha espresso in forma numerica: l'articolo è
disponibile sul server delle news.
Body follows invece indica il tipo di informazioni che seguirà
il codice della risposta, in questo caso il BODY.
Di seguito si hanno successive linee che rappresentano i dati
richiesti.
Come delimitatore ultimo presentano due righe vuote separate
da un'ulteriore riga che presenta, come primo ed unico carattere
un punto.
Ciò facilita enormemente le cose: si immagini infatti
di richiedere più dati differenti in successione. Con
questa notazione alla fine di ogni risposta è possibile
conoscere in tempo reale quanto termina un'informazione e comincia
il codice della risposta dell'informazione successiva.
Ad esempio:
222
219512 article retrieved - body follows
<corpo dell'articolo>
<corpo dell'articolo>
<..>
<..>
<corpo dell'articolo>
.
412
no newsgroup has been selected
.
|
In questo caso l'utilità della notazione sopra descritta
è ancora più evidente.
Come si vedrà meglio successivamente si può considerare
interrotta la prima risposta al presentarsi nel testo della
risposta di una serie formata da una linea vuota, una linea
con un punto ed ancora una line vuota:
VB.NET
e VB6
Trim$(Risposta), vbCrLf & "." & vbCrLf |
Naturalmente è da prendere il considerazione il fatto
che un'informazione (da qui in poi si utilizzerà il termine
informazione per definire la serie di dati inviati dal server
in risposta ad una richiesta dell'applicazione client) possa
essere rappresentata da una stringa vuota.
Ciò non esce affatto dall'affermazione dei capitoli precedenti:
l'informazione può essere vuota ma il codice della risposta
no.
Ad esempio si consideri di voler recuperare il BODY di un articolo
che abbia un testo di lunghezza zero e che quindi sia rappresentato
dalla stringa "".
In tal caso, se il messaggio verrà individuato sul server
delle news, si otterrà una risposta del tipo:
| 222
219512 article retrieved - body follows
.
|
Inoltre non tutte le RFC presentano la stessa tipologia di risposta.
RFC977 prevede che le informazioni strutturate (ossia quelle
che contengono più dati eterogenei) abbiano la seguente
costruzione:
ossia che i dati siano separati semplicemente dallo spazio "
".
RFC2980 prevede invece un caso particolare, il comando OVERVIEW
inviato il quale si otterrà un'informazione strutturata
e suddivisa seguendo la costruzione:
dove cioè il carattere di separazione tra i differenti
dati è il simbolo di tabulazione TAB, ottenibile in Visual
Basic attraverso il codice Chr(9).
|
|