![]() |
![]() Sincronizza Indice |
![]() Scarica il progetto |
![]() Testo dell'articolo |
![]() Stampa l'articolo |
L'esempio più semplice in assoluto di programma Client/Server
è la chat.
La parte server di questa semplice chat aprirà la porta 2000 in modalità di ascolto ed attenderà la connessione da parte della parte client del progetto. L'esempio funzionerà senza alcun protocollo, ovvero non esisteranno regole che stabiliscono il formato dei messaggi o ne controllano la correttezza. Tutti i dati che un utente invierà all'altro saranno mostrati in una casella di testo.
Innanzitutto inseriremo un CommandButton Inseriremo anche due caselle di testo: la prima sarà chiamata txtReply ed avrà la proprietà Multiline settata a True; la seconda sarà chiamata txtOut. Il form si conclude con un altro pulsante di nome Invia. Il funzionamento del form è molto semplice: l'utente del server prima di poter ricevere chiamate dal client deve porre il programma in attesa di connessione premendo il pulsante Listen. Una volta che l'altro utente si sarà collegato i messaggi provenienti dal client saranno mostrati nella casella di testo grande. L'altra casella più piccola con il pulsante Invia servirà per inviare messaggi al client. Il codice è altrettanto semplice:
Come prima cosa porremo il server in attesa (in ascolto).
Alla riga 5 stabiliamo la porta locale sulla quale il server ascolterà (riga 6). Non appena il server si sarà messo in attesa sarà aggiunto alla txtReply il testo "Server in attesa..." ed il cursore sarà spostato alla fine del testo (righe 7-8). Da questo momento in poi il server non potrà fare nulla fino a quando il client non si connette ad esso.
Quando un qualunque computer tenta di collegarsi al server, scatterà
l'evento Così, alla riga 11, viene innanzitutto controllato se il server era precedentemente collegato. Nel caso che lo fosse, sarà disconnesso prima di effettuare una nuova connessione. Alla riga 12 viene accettata la connessione mediante il metodo
Nel momento in cui il server riceve dati, tramite il client oppure tramite
una qualunque altra connessione, verrà eseguito l'evento Per leggere i dati sarà necessaria una variabile di tipo
Stringa che chiameremo DATI. Mediante essa leggeremo i dati
utilizzando il metodo Sarà allora possibile mostrarne il contenuto aggiungendolo alla casella di testo txtReply e spostando il cursore alla fine del testo (righe 21-22).
Le funzioni del server si completano concedendogli la possibilità di comunicare con il client. Abbiamo un pulsante Invia che invia il testo presente nella casella di testo txtReply. Pertanto l'esecuzione dell'evento Click del pulsante dovrà
inviare i dati al socket collegato. Prima di effettuare quest'operazione,
però, è necessario verificare se il server è connesso
(riga 26). Se esso non è connesso, il tentativo di inviare dati
genera un errore. Il raggiungimento della riga 31 presuppone la connessione del server con il client. Potremo pertanto inviare i dati mediante il metodo SendData e specificando come testo il contenuto della casella di testo txtOut. Il server termina qui. Possiamo provare il nostro server e collegarci ad esso mediante un qualunque programma di Telnet specificando come server l'indirizzo del computer in cui viene eseguito il programma server e come porta il numero 2000.
Similmente al form server, questo contiene un pulsante di nome Connetti,
una Label Per comunicare abbiamo bisogno anche di una casella di testo di nome txtReply con la proprietà Multiline impostata a True, una casella di testo di nome txtOut ed un pulsante di comando di nome Invia. Il funzionamento è estremamente semplice: l'utente deve immettere l'indirizzo IP o il DNS del server in ascolto sulla porta 2000 e premere il pulsante Connetti. Stabilita la connessione sarà possibile scrivere messaggi nella casella piccola e inviarli con il tasto Invia. Il codice è persino più semplice di quello del server:
Al click sul pulsante Connetti il client dovrà tentare la connessione al server, il cui indirizzo è specificato nella casella txtHostName. Alle righe 4 e 5 viene mostrato un messaggio all'utente che avverte della richiesta connessione. Alla riga 6 viene chiuso l'eventuale socket aperto; se l'utente preme il pulsante Connetti mentre è connesso, sarà eseguita la disconnessione, l'impostazione della porta locale 0 (riguardo lo stato TIME_WAIT di NETSTAT) per far scegliere al sistema operativo una porta TCP libera (riga 7). Possiamo adesso effettuare la connessione al server utilizzando il metodo Connect del socket wskClient richiedendo come indirizzo a cui collegarsi quello specificato nella casella di testo txtHostName e numero della porta 2000.
In maniera perfettamente identica al server, quando arrivano dati al socket wskClient, sarà necessario estrarre i dati, salvarli in una variabile di nome DATI e visualizzarli nella casella di testo txtReply (righe 12-15).
Anche qui il processo è del tutto analogo a quello del server.
Per provare i due programmi, se si dispone di una LAN, installare il server su un computer ed il client su un altro; se si dispone invece di un solo computer e non si ha la possibilità di far installare il programma ad un amico connesso su internet, è possibile eseguire entrambi i computer sulla stessa macchina. Fatto questo sarà possibile eseguire il programma client, immettere l'indirizzo IP della macchina che funge da server (se entrambi vengono eseguiti sulla stessa macchina, utilizzare l'indirizzo di loopback 127.0.0.1 per chiamare il server della stessa macchina) e premere il pulsante connetti. Sarà facilmente possibile comunicare tra i due programmi.
|
Il progetto è molto semplice e contiene molti errori legati alla disconnessione di uno dei computer. Inoltre non esistendo protocollo non sarà possibile scambiare comandi tra i due programmi. Questo esempio intende soltanto introdurre il funzionamento di base del controllo Winsock e mostrare quali sono le procedure di base da eseguire per controllare qualsiasi programma Client/Server. Alberto
Alagna
|
![]() |