Utilizzo dei servizi TCP

Il protocollo TCP viene utilizzato dalla classe TcpClient per richiedere i dati a una risorsa Internet. I dettagli relativi alla creazione di una classe Socket vengono utilizzati nei metodi e nelle proprietà di TcpClient al fine di richiedere e ricevere dati tramite TCP. Poiché la connessione alla periferica remota è rappresentata come un flusso, i dati possono essere letti e scritti mediante le tecniche di gestione dei flussi di .NET Framework.

Il protocollo TCP consente di stabilire una connessione con un endpoint remoto e di utilizzare la connessione per inviare e ricevere pacchetti di dati. Inoltre, con questo protocollo esiste la garanzia che i pacchetti di dati vengano inviati all'endpoint e assemblati in ordine corretto al loro arrivo.

Per stabilire una connessione TCP è necessario conoscere l'indirizzo della periferica di rete in cui si trova il servizio richiesto e la porta TCP utilizzata dal servizio per comunicare. È l'autorità IANA (Internet Assigned Numbers Authority) che definisce i numeri di porta per i servizi comuni. Per informazioni, visitare il relativo sito Web all'indirizzo www.iana.org/assignments/port-numbers (informazioni in lingua inglese). Per i servizi che non compaiono nell'elenco IANA sono disponibili numeri di porta compresi tra 1.024 e 65.535.

Nell'esempio di codice che segue viene illustrata l'impostazione di una classe TcpClient per la connessione a un server di riferimento ora sulla porta TCP 13.

Imports System
Imports System.Net.Sockets
Imports System.Text

Public Class TcpTimeClient
    Private const portNum As Integer = 13
    Private const hostName As String = "host.contoso.com"
    
    ' Entry point  that delegates to C-style main Private Function.
    Public Overloads Shared Sub Main()
        System.Environment.ExitCode = _
            Main(System.Environment.GetCommandLineArgs())
    End Sub
    
    
    Overloads Public Shared Function Main(args() As [String]) As Integer
        Try
            Dim client As New TcpClient(hostName, portNum)
        
            Dim ns As NetworkStream = client.GetStream()
            
            Dim bytes(1024) As Byte
            Dim bytesRead As Integer = ns.Read(bytes, 0, bytes.Length)
            
            Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytesRead))
        
        Catch e As Exception
            Console.WriteLine(e.ToString())
        End Try
        
        client.Close()
        
        Return 0
    End Function 'Main
End Class 'TcpTimeClient

[C#]
using System;
using System.Net.Sockets;
using System.Text;

public class TcpTimeClient {
    private const int portNum = 13;
    private const string hostName = "host.contoso.com";

    public static int Main(String[] args) {
        try {
            TcpClient client = new TcpClient(hostName, portNum);

            NetworkStream ns = client.GetStream();
            
            byte[] bytes = new byte[1024];
            int bytesRead = ns.Read(bytes, 0, bytes.Length);

            Console.WriteLine(Encoding.ASCII.GetString(bytes,0,bytesRead));

            client.Close();

        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }

        return 0;
    }
}

La classe TcpListener viene utilizzata per monitorare una porta TCP in attesa di richieste in ingresso e quindi creare una classe Socket o TcpClient che gestisca la connessione al client. L'attesa sulla porta viene attivata dal metodo Start e disattivata dal metodo Stop. Tramite i metodi AcceptTcpClient e AcceptSocket vengono accettate le richieste di connessione in ingresso e per la gestione delle richieste vengono create rispettivamente una classe TcpClient e una classe Socket.

Nell'esempio che segue viene illustrata la creazione di un server di riferimento ora di rete mediante l'utilizzo di una classe TcpListener per monitorare la porta TCP 13. Quando viene accettata una richiesta di connessione in entrata, mediante il server di riferimento ora vengono fornite la data e l'ora correnti del server host.

Imports System
Imports System.Net.Sockets
Imports System.Text

Public Class TcpTimeServer
    
    Private const portNum As Integer = 13
    
    ' Entry point that delegates to C-style main Private Function.
    Public Overloads Shared Sub Main()
        System.Environment.ExitCode = _
            Main(System.Environment.GetCommandLineArgs())
    End Sub
    
    
    Overloads Public Shared Function Main(args() As [String]) As Integer
        Dim done As Boolean = False
        
        Dim listener As New TcpListener(portNum)
        
        listener.Start()
        
        While Not done
            Console.Write("Waiting for connection...")
            Dim client As TcpClient = listener.AcceptTcpClient()
            
            Console.WriteLine("Connection accepted.")
            Dim ns As NetworkStream = client.GetStream()
            
            Dim byteTime As Byte() = _
                Encoding.ASCII.GetBytes(DateTime.Now.ToString())
            
            Try
                ns.Write(byteTime, 0, byteTime.Length)
                ns.Close()
                client.Close()
            Catch e As Exception
                Console.WriteLine(e.ToString())
            End Try
        End While
        
        listener.Stop()
        
        Return 0
    End Function 'Main
End Class 'TcpTimeServer
[C#]
using System;
using System.Net.Sockets;
using System.Text;

public class TcpTimeServer {

    private const int portNum = 13;

    public static int Main(String[] args) {
        bool done = false;
        
        TcpListener listener = new TcpListener(portNum);

        listener.Start();

        while (!done) {
            Console.Write("Waiting for connection...");
            TcpClient client = listener.AcceptTcpClient();
            
            Console.WriteLine("Connection accepted.");
            NetworkStream ns = client.GetStream();

            byte[] byteTime = Encoding.ASCII.GetBytes(DateTime.Now.ToString());

            try {
                ns.Write(byteTime, 0, byteTime.Length);
                ns.Close();
                client.Close();
            } catch (Exception e) {
                Console.WriteLine(e.ToString());
            }
        }

        listener.Stop();

        return 0;
    }
    
}

Vedere anche

TCP/UDP