Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Visto il client nella parte precedente, rimane da vedere il server, leggermente più complesso del precedente. Il secondo progetto si compone di un solo form che farà uso del
controllo FBI Shape Progress Bartrattato
nella sezione Controlli utente da
aggiungere al progetto. Sulla superficie del form avremo una ListBox di nome Stati, nella quale saranno inserite alcune informazioni sulla connessione e sul trasferimento dei dati. Sono presenti anche due controlli Winsockdi
nome Socket e Passivo, due Labelindicative
di nome StatoLabel ed Avanzamento. Entrambe avranno la proprietà
Autosize impostata a True, ma la prima avrà anche la proprietà
Wordwrap impostata a True, mentre la seconda avrà la proprietà
Alignment impostata a 2-Center. Il server non potrà fornire alcun comando, eccetto che rispondere
SI o NO alla richiesta di trasferimento del file per accettarlo o rifiutarlo.
Abbiamo dichiarato 3 variabili che verranno utilizzate più volte all'interno del programma: FILEHANDLE è l'handle del file aperto per il trasferimento; DIMENSIONEFILE è la dimensione in bytes aspettata; infine FILEDASALVARE è il nome del file da salvare compreso del percorso della cartella.
All'avvio del programma viene aperta la porta 1500 in ascolto per la connessione sul controllo Socket (righe 10 e 11).
Così alla chiusura del form viene chiusa anche la connessione aperta con Socket.
Nel momento in cui Socket riceve una richiesta di connessione, esso termina di ascoltare ed accetta la chiamata, senza preoccuparsi di chi sia.
Nel momento in cui la connessione viene chiusa (dal lato client), vengono chiusi tutti i socket aperti e Socket viene posto nuovamente in attesa di chiamata.
L'eventoDataArrival
sul primo socket servirà per accettare il trasferimento del file
oppure annullarlo una volta avviato. Ricordiamo che il server accetta
solo due comandi:
Saranno utilizzate una serie di variabili: la matrice di bytes DATI servirà per contenere i dati ricevuti dal client; NOMEFILE verrà utilizzata per contenere il nome del file in arrivo, POSIZIONE verrà utilizzata per effettuare l'estrazione dei parametri dai dati ricevuti dal client, DIMENSIONE sarà invece la dimensione in bytes del file in arrivo e TEMPSTR sarà utilizzata per manipolare le stringhe.
Alla riga 38 vengono letti i dati in arrivo su Socket e subito
successivamente vengono convertiti in Unicode,
allo scopo di utilizzarli come stringhe. Se la stringa ricevuta inizia per Alle righe 43-46 viene estratta la posizione dell'ultimo spazio separatore, al fine di rintracciare il punto dove termina il nome del file ed inizia la dimensione. Tale posizione sarà salvata nella variabile POSIZIONE. Solo allora (righe 47 e 48) sarà possibile estrarre il nome del file (salvato in NOMEFILE) e la sua dimensione (memorizzata in DIMENSIONE). Alle righe 49-51 viene formata la stringa TEMPSTR che verrà utilizzata per mostrare un avviso all'utente. Essa conterrà anche il nome del file in arrivo e la sua dimensione.
Tale
avviso sarà mostrato all'utente. Se alla richiesta di trasferimento
l'utente rispnderà NO, sarà inviato al client
il messaggio Se l'utente invece risponderà SI, verrà generato il percorso completo del file da salvare, composto dal percorso della cartella in cui il programma server si trova, dalla cartella RICEVUTI e dal nome del file in arrivo. Il percorso completo sarà memorizzato nella variabile FILEDASALVARE. Prima di procedere alla scrittura del file, sarà necessario verificare se il file esiste (le varie soluzioni possibili sono spiegate in un HowTo). Se esso esiste, sarà mostrato un avviso di sovrascrittura all'utente (righe 55-57). Se l'utente richiederà la sovrascrittura, il file originale sarà cancellato prima di ricevere il file nuovo (righe 57-58). In caso contrario il file originale sarà lasciato lì e verrà ritornato al server il messaggi di non accettazione del file. In altre situazioni potrebbe essere comodo specificare un nuovo nome di file in cui salvare il file in arrivo.
Alla riga 65 viene impostata la variabile globale DIMENSIONEFILE, che verrà utilizzata dal resto del programma, uguale a DIMENSIONE. Sarà necessario aprire un socket passivo in ascolto su una porta
casuale e comunicare il numero di tale porta al client, nella forma Se, invece, l'utete ha risposto NO alla richiesta di trasferimento, sarà
inviata al client la risposta
In caso che il client volesse terminare il trasferimento a metà, invierà il comando "/FINE" (non implementato in questo esempio) al cui ricevimento il server si occuperà di chiudere il socket passivo e l'handle del file in scrittura.
Nel momento in cui il client richiede il collegamento con il socket passivo, viene aperto il file FILEDASALVARE in modalità binaria e viene accettata la richiesta di collegamento.
Analogamente nel momento della disconnessione viene chiuso il file aperto. Tutti i dati che arriveranno al socket passivo saranno scritti all'interno del file di output.
L'eventoDataArrival
indica l'arrivo di dati al socket Passivo. Abbiamo detto che tali
dati andranno scritti all'interno del file. Ma è necessario effettuare
un controllo d'obbligo, ovvero che la somma dei dati ricevuti sia maggiore
o uguale della dimensione aspettata (DIMENSIONEFILE). In tal caso
sarà necessario eliminare i dati inutili che sono stati inviati
mediante l'utilizzo dell'istruzione Redim, avendo cura di specificare
la parola chiave Preserve per non distruggere il resto dei
dati (riga 105).
Se invece la somma dei dati inviati non corrisponde alla fine del file,
l'intero pacchetto sarà salvato nel file (riga 118), la barra di
avanzamento sarà aggiornata (righe 121 e 122) e verrà rimandato
indietro l'ACK
Un'ultima funzioncina prima di vedere il funzionamento del programma è legata al doppio click sopra la LisBox Stati. L'intera lista sarà cancellata. Può essere utile quando essa diviene troppo piena o per verificare l'andamento del trasferimento senza riavviare il programma.
Avviare sia il client che il server su uno o due computer collegati.
Inserire nel client l'indirizzo IP
del computer in cui viene eseguito il server e premere il pulsante Connetti.
Se il server viene eseguito nella stesso computer del client, specificare
come IP l'indirizzo di loopback
127.0.0.1. Il server riceverà la richiesta di trasferimento. Premendo il pulsante Si alla richiesta di trasferimento il programma client potrà avviare il trasferimento. Man mano che il trasferimento procede saranno mostrate le informazioni di avanzamento nella ListBox del server e nella sua barra di avanzamento
Il termine del trasferimento sarà notificato anche sul programma client con una finestra di messaggio apposita.
|
Il nostro programma è terminato. Fibia
FBI
|
Torna all'indice Client/Server |