Utilizzo di un socket client sincrono

Quando si utilizza un socket client sincrono è possibile sospendere il programma applicativo in attesa del completamento delle operazioni di rete. L'utilizzo dei socket sincroni non è adatto alle applicazioni le cui operazioni richiedono un utilizzo intensivo delle risorse di rete. Essi possono invece consentire ad altri tipi di applicazioni un semplice accesso ai servizi di rete.

Per inviare dati è necessario passare una matrice di byte a uno dei metodi di invio di dati della classe Socket, vale a dire a Send o a SendTo. Nell'esempio riportato di seguito una stringa viene codificata nel buffer di una matrice di byte mediante la proprietà Encoding.ASCII, quindi il buffer viene trasmesso alla periferica di rete mediante il metodo Send. Tramite tale metodo viene restituito il numero dei byte inviati alla periferica di rete.

Dim msg As Byte() = _
    System.Text.Encoding.ASCII.GetBytes("This is a test.")
Dim bytesSent As Integer = s.Send(msg)

[C#]
byte[] msg = System.Text.Encoding.ASCII.GetBytes("This is a test");
int bytesSent = s.Send(msg);

Il metodo Send consente di rimuovere i byte dal buffer e di accodarli per l'invio alla periferica di rete mediante l'interfaccia di rete. I dati potrebbero non venire inviati immediatamente bensì alla fine, purché la connessione venga chiusa normalmente mediante il metodo Shutdown.

Per ricevere dati da una periferica di rete è necessario passare un buffer a uno dei metodi di ricezione di dati della classe Socket, vale a dire a Receive o a ReceiveFrom. I socket sincroni consentono di sospendere l'applicazione fino alla completa ricezione dei byte dalla rete o alla chiusura del socket. Nell'esempio riportato di seguito i dati vengono ricevuti dalla rete e visualizzati nella console. In questo esempio si presuppone che i dati provenienti dalla rete siano testo con codifica ASCII. Tramite il metodo Receive viene restituito il numero dei byte ricevuti dalla rete.

Dim bytes(1024) As Byte
Dim bytesRec = s.Receive(bytes)
Console.WriteLine("Echoed text = {0}", _
    System.Text.Encoding.ASCII.GetString(bytes, 0, bytesRec))

[C#]
byte[] bytes = new byte[1024];
int bytesRec = s.Receive(bytes);
Console.WriteLine("Echoed text = {0}",
    System.Text.Encoding.ASCII.GetString(bytes, 0, bytesRec));

Una volta non più necessario, il socket dovrà essere rilasciato chiamando il metodo Shutdown, quindi il metodo Close. Nell'esempio riportato di seguito viene rilasciato un Socket. L'enumerazione SocketShutdown consente di definire costanti che indicano se il socket deve essere chiuso per l'invio, la ricezione o in entrambi i casi.

s.Shutdown(SocketShutdown.Both)
s.Close()
[C#]
s.Shutdown(SocketShutdown.Both);
s.Close();

Vedere anche

Utilizzo di un socket client asincrono | Attesa mediante socket | Utilizzo di socket client