Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Vedremo come scrivere una funzione che mostri in un programma client l'elenco delle cartelle e dei files presenti sul computer in cui è presente il server.
Passiamo subito alla costruzione della parte Server, ovvero la parte del progetto che si occupa di fornire i dati e trasmetterli alla parte Client. Nel nostro progetto vogliamo leggere la struttura delle cartelle presenti sul computer dove viene eseguito il Server. Tale struttura verrà inviata al programma client che si occuperà di visualizzarla nella maniera più adeguata. Tutte le comunicazioni avverranno via TCP/IP sulla porta 1500. Il server si compone di tre soli controlli posizionati sopra un form di nome ServerForm.
Abbiamo innanzitutto un controllo Winsock di nome Server. Impostiamo
la sua proprietà LocalPort a 1500. Inseriamo anche un controllo Timer di nome TimeOut. Esso controllerà l'attività del server; se per 60 secondi non vengono inviati dati dal programma client, il controllo TimeOut provvederà a chiudere la connessione. Questo genere di controlli sono obbligatori, particolarmente in connessioni Dial-Up via modem. Se si dovesse disconnettere la linea, in alcuni casi, non riusciremmo più a connetterci al server perché la connessione risulterebbe già effettuata. In questo modo basterà aspettare fino a 60 secondi dall'ultimo comando inviato per potersi riconnettere al server. Impostiamo quindi la proprietà Interval a 60000 millisecondi, ovvero 60 secondi. L'ultimo controllo presente sul nostro form è una Label di nome StatoConnessione. Essa visualizzerà se la connessione è stabilita oppure se non vi è nessun utente collegato al server. Prima di passare al codice vero e proprio analizziamone il funzionamento. Il server autonomamente non invierà nessun dato al Client. Esso resterà fermo fintanto che non sarà inviato dal Client qualche comando. La ricezione di dati comporta l'esecuzione dell'evento DataArrival. Tutti i dati inviati al server devono necessariamente terminare con un INVIO (costante vbNewLine). La motivazione è molto semplice: esistono svariati programmi di connessione - un esempio lampante è il Telnet di Windows - che inviano i dati carattere per carattere. Per cui al server non arriverebbero mai stringhe complete ma solo tante serie composte da un solo carattere. Per questo motivo tutti i dati ricevuti vengono immagazzinati in un buffer finché l'ultimo carattere ricevuto non è il tasto INVIO. Esso decreta la fine di una riga di comando. Quando il comando si completa con l'INVIO esso sarà analizzato da una funzione che si occupa di effettuare le operazioni legate al comando. Subito dopo l'esecuzione del comando il buffer dei caratteri ricevuti deve essere svuotato per permettere l'esecuzione di un altro comando. Inoltre ogni volta che viene inviato qualche dato al Server il Timer TimeOut deve ricominciare il suo conteggio. Vediamo ora il codice:
La variabile DATIINARRIVO è il buffer in cui vengono immagazzinati tutti i caratteri ricevuti fino a quando non viene inviato un INVIO.
All'avvio del programma il server viene messo in ascolto sulla porta indicata dalla proprietà LocalPort, ovvero la 1500.
Nel momento della chiusura del server vengono chiuse tutte le connessioni e viene forzata la chiusura del programma.
Questa routine indica la chiusura della connessione. La riga 14 è
presente per il fatto che alcune funzioni più in basso fanno riferimento
a quest'evento, ma senza tale riga la chiamata ad esso non assicura la
chiusura della connessione.
Alla chiusura della connessione il server si rimette in ascolto per attendere un'ulteriore connessione e nel frattempo cambia il contenuto della Label StatoConnessione.
Nel momento in cui il server riceve una richiesta di connessione scatta
quest'evento. In seguito a quella avviene l'accettazione della chiamata tramite il
metodo Accept.
Questo evento viene eseguito ogni volta che il server riceve dei dati. La ricezione di un dato comporta l'azzeramento del contatore TimeOut
effettato tramite la riga 29. Se l'ultimo carattere contenuto nel buffer è INVIO, allora il
buffer dovrà essere analizzato per controllare se esso contiene
dei comandi validi per il serve. Se l'ultimo tasto inviato è INVIO verrà eseguita la funzione GestisciComandi, che analizza il contenuto del buffer. In seguito all'analisi dei parametri il buffer viene azzerato per permettere la ricezione di nuovi comandi (riga 35). Dopo quest'operazione viene riattivato il contatore TimeOut che permette la disconnessione automatica dopo 60 secondi di inattività.
Infatti dopo 60 secondi di inattività scatta l'evento Timer del controllo TimeOut. Esso effettua la disconnessione tramite la funzione Server_Close (che al suo interno racchiude l'istruzione di disconnessione).
Questa funzione si occupa di smistare i dati ricevuti dal controllo Server. Seguono una serie di possibili comandi, come la chiusura della connessione
o l'elencazione di tutti i files, dei soli files o delle sole cartelle
contenute nella directory di lavoro. I messaggi che invia il server iniziano con " +OK:" se l'esecuzione del comando è esatta oppure con " -ERR:" se l'esecuzione non è andata a buon fine. Per ragioni di compatibilità in ogni caso alla fine di ogni risposta da parte del server segue un carattere di INVIO (vbNewLine). Se il comando passato alla funzione GestisciComandi contiene almeno uno spazio viene separato il comando vero (quello precedente allo spazio) dai parametri che seguono lo spazio. Il parametro viene memorizzato in una variabile di nome Valore.
Questo server gestisce soltanto un comando parametrico: il CD, ovvero la richiesta di cambio della cartella di lavoro. Viene per cui effettuato un controllo se il comando parametrico è CD. In caso di risposta affermativa viene cambiata la directory di lavoro tramite l'istruzione ChDir e viene inviato un messaggio di conferma con la nuova cartella.
L'ultima funzione del programma Server è la LeggiFilesDir che effettua la scansione di una cartella e restituisce al programma client una riga contenente la lista dei files e/o cartelle contenuti in essa. La funzione richiede tre parametri: il primo (CARTELLA) è la cartella di cui effettuare la scansione; il secondo (CARTELLE) determina se devono essere restituite le cartelle. Se il suo valore è False tutte le cartelle saranno escluse dalla scansione. L'ultimo parametro (FILES) indica se devono essere restituiti i nomi dei files. Se ad esempio il parametro CARTELLE è True ed il parametro FILES è False, saranno restituite soltanto le cartelle contenute nella directory di lavoro. Quando, invece entrambi i parametri sono impostati a True saranno restituiti sia i files che le cartelle contenuti nella directory di lavoro.
La variabile ELENCOFILESDIR conterrà l'elenco di tutti i files o le cartelle rilevate nella scansione, ognuga separata da INVIO (vbNewLine). Alla riga 70 tale variabile viene inizializzata con una stringa nulla. Alla riga 71 viene effettuato un controllo: se l'ultimo carattere del parametro CARTELLA è "\" allora viene in automatico scartato prendendo tutti i caratteri di CARTELLA tranne l'ultimo. Alla riga 72 inizia la vera e propria scansione. Alla riga 73 viene azzerato il contenuto della variabile VALIDO. Essa servirà per determinare se l'elemento estratto dalla directory di lavoro deve essere aggiunto all'elenco. Segue un ciclo che si ripeterà finché esistono files o
cartelle nella directory di lavoro. Alla riga 77 viene controllato se l'attributo VALIDO è True; in caso positivo il file indicato nella variabile TEMPSTR viene aggiunto all'elenco degli elementi, separato dal precedente da un INVIO. L'ultima riga prima della fine del ciclo (riga 78) cerca l'elemento successivo
nella scansione. Subito dopo la fine del ciclo viene inviato al programma client l'elenco
degli elementi della scansione nella solita forma: La parte server di questo programmino termina qui. |
Fibia
FBI
|
Torna all'indice Client/Server |