• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Guida Winsock II parte

Max090

Utente Mitico
Autore del topic
20 Dicembre 2008
6.760
88
Miglior risposta
0
Il controllo Winsock ed il protocollo TCP (Seconda parte)
________________________________________
Nel corso della precedente lezione abbiamo visto alcuni dei concetti che stanno alla base della comunicazione tra computer, cominciando ad esplorare come un solo computer si possa comportare nel corso di tale dialogo sia da server che da client.
Ciò presuppone che il dialogo sia bilaterale ossia che il nostro computer possa svolgere entrambe le funzioni necessarie a comunicare: ricevere i dati (i messaggi) ed recuperare informazioni sull'utente ed inviare pacchetti di dati a un server centrale.
Per far ciò è necessario impostare un modello che preveda sia la ricezione di dati che l'invio degli stessi. Questo permette anche di eseguire esperimenti in locale, sfruttando entrambe le funzioni inviando ad esempio un pacchetto di dati allo stesso computer.
Abbiamo perciò cominciato a vedere come si svolge l'invio di dati, impostando la porta di comunicazione e mettendo il programma server in ascolto di eventuali comunicazioni che possano provenire dall'esterno (o dall'interno, se si vuole includere anche l'esempio esposto poco sopra).
Infine abbiamo testato lo stato della comunicazione: prima di poter inviare dei dati è infatti necessario chiudere le comunicazioni precedentemente avviate con altri computer.
Questo è il caso del progetto che stiamo analizzando, però "[...] è [...] possibile accettare varie richieste di connessione utilizzando lo stesso controllo, creando una matrice di controlli. In questo caso non sarà necessario chiudere la connessione, ma sarà sufficiente creare una nuova istanza del controllo, impostandone la proprietà Index, e richiamare il metodo Accept per la nuova istanza [...]".
Tale caso sarà comunque analizzato più avanti.
Allo scopo di permettere un'unica comunicazione tra client e server, sarà necessario includere nel listato del programma il blocco di codice qui sotto, l'ultimo visto nella lezione precedente:
Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
If tcpServer.State <> sckClosed Then
tcpServer.Close
End If

Notare che è stato assegnato al controllo Winsock il nome tcpServer. Questo accorgimento può risultare utile a distinguere il controllo Winsock utilizzato nella form Server e quello nella form Client.
Quando si arriverà a sviluppare il secondo blocco sarà infatti necessario includere un secondo controllo Winsock denominato questa volta tcpClient.
Nulla vieta però di mantenere i nomi originali dei controlli ossia Winsock1 e Winsock2.
A tale blocco però manca ancora qualcosa: nel caso di richiesta di comunicazione da parte di un computer client infatti, si farà in modo di accettare tale richiesta. Una volta giunti a questa linea di codice la comunicazione si può considerare avviata.
Il blocco di codice visto poco sopra integrato con la linea di codice di cui si parlava, apparirà in questo modo:
Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
If tcpServer.State <> sckClosed Then
tcpServer.Close
End If
tcpServer.Accept RequestID
End Sub

Adesso dobbiamo istruire il controllo sulle operazioni da eseguire in caso di richiesta di da parte del client oppure in caso di invio dei dati.
Pensiamo innanzitutto alla prima eventualità. Quando arrivano dati dal computer client infatti viene richiamato il metodo DataArrival come si è visto nella tabella contenuta nella lezione precedente.
Prima di vedere il codice studiamo la cronologia degli eventi associati a questo caso: s'immagini di avere due computer separati. L'utente del computer A è intenzionato ad entrare in comunicazione col computer B. Nel momento in cui l'utente di A preme il tasto che avvia la comunicazione, il suo computer compie una breve ricerca sulle informazioni che lo identificano (ID, nome del computer).
Una volta terminata questa operazione finalmente la comunicazione viene avviata ed i primi dati inviati dal client al server sono quelli di riconoscimento del computer che fa la richiesta (è un po' come chiamare una persona al telefono e prima di iniziare un discorso, dire come ci si chiama ed eventualmente fornire ulteriori informazioni come l'Azienda per conto della quale si telefona e così via).
Ecco perchè abbiamo incluso la linea di codice:
tcpServer.Accept RequestID

Dopodichè tutte le informazioni inviate dal computer A vengono incluse in una variabile dell'applicazione del computer B che chiamiamo strData, inizialmente vuota, che andrà finalmente a riempire la casella di testo che abbiamo precedentemente inserito nella form.
E' come se colui che riceve la telefonata, si preoccupi di annotare su un foglio, ancor prima di cominciare la comunicazione vera e propria, l'identità di chi è dall'altra parte del telefono.
Tradotto in codice quanto appena detto ci troviamo di fronte a questo risultato:
Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
tcpServer.GetData strData
Text1.Text = strData
End Sub

Prima di continuare c'è da fare un'importante precisazione ossia che il metodo GetData del controllo Winsock (o tcpServer nel nostro caso) svuota automaticamente la variabile strData con le informazioni del computer client dopo averle inviate alla casella di testo Text1.
Per evitare ciò si può far ricorso alla proprietà PeekData che come visto nella tabella della lezione precedente "A differenza di GetData, [...] non rimuove i dati dalla coda di input. Questo metodo può essere utilizzato solo per le connessioni TCP. Tale metodo ha una sintassi praticamente simile a quella di GetData ossia: Winsock.PeekData dati, [tipo,] [lunMax]".
Per concludere manca il codice relativo all'invio dei dati da parte del server, invio che viene effettuato mediante la pressione del tasto Command1 che avevamo inserito sul piano.
I dati inviati corrispondono al contenuto di una casella di testo che possiamo chiamare Text2. La procedura da seguire in questo caso è davvero molto semplice e non necessita di grossi chiarimenti. Semplicemente alla pressione del tasto, il controllo Winsock fa uso della proprietà SendData che invia i dati al client:
Private Sub Command1_Click()
tcpServer.SendData Text2.Text
End Sub

In questo modo abbiamo concluso le funzioni che competono all'applicazione Server. La prossima volta vedremo quelle riferite all'applicazione Client e come le due si possano integrare tra di loro creando una comunicazione continua e bilaterale.
FINE
FONTE:
Perfavore, Entra oppure Registrati per vedere i Link!
 
Grazie per averla postata, mi serviva.
Sembra tanto lunga ma alla fine sono praticamente le basi