Home / Programmazione / C# - Asp.NET / Server Socket in C#
Mattepuffo

Server Socket in C#

Server Socket in C#

Torniamo a parlare di C#; l'argomento riaguarda le Socket, e nello specifico la parte server.

Della parte cliente ne parlerò in altro articolo....

La classe che andremo a creare avrà due metodi: una per la connessione e una per lo spegnimento del server.

Il server sarà in ascolto su una porta specifica (cercate di non usare le porte più comuni tipo la 80 o la 21) ed useremo il protocollo TCP (questo dipende anche dall'uso che ne dovete fare).

La classe è questa qua:

    class Server
    {
        private Socket listener;

        public void socketServer()
        {
            int MAXBUFFER = 1024;
            Console.WriteLine("SOCKET STARTED");
            listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(new IPEndPoint(IPAddress.Any, 20248));
            listener.Listen(10);
            while (true)
            {
                Console.WriteLine("WAITING CONNECTION");
                Socket socket = listener.Accept();
                string receivedMessage = string.Empty;
                while(true)
                {
                    byte[] receivedBytes = new byte[MAXBUFFER];
                    int numBytes = socket.Receive(receivedBytes);
                    receivedMessage += Encoding.ASCII.GetString(receivedBytes, 0, numBytes);
                    if (receivedMessage.IndexOf("\n") > -1)
                    {
                        break;
                    }
                }
                Console.WriteLine("MESSAGE FROM CLIENT: {0}", receivedMessage);
                string replyMessage = "MESSAGE RECEIVED";
                byte[] replyBytes = Encoding.ASCII.GetBytes(replyMessage);
                socket.Send(replyBytes);
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
        }

        public void shutdownServer()
        {
            listener.Shutdown(SocketShutdown.Both);
            listener.Close();
        }
    }

Quando istanziamo la Socket listener, gli diamo alcuni parametri:

  • AddressFamily imposta la famiglia di indirizzi
  • SocketType il tipo di socket
  • ProtocolType il tipo di protocollo

Alla riga sotto impostiamo gli indirizzi dal quale accettare connessioni (in questo caso tutti) e la porta di ascolto (20248).

Con il metodo Listen la mettiamo in attesa di connessioni.

Avviamo un primo ciclo infinito, nel quale associamo un altro oggetto Socket al primo e lo mettiamo in stato di accettazione di connessione.

Nel secondo ciclo riceviamo i byte dal cliente che si connette (se il client invia byte ovviamente).

Riceviamo in byte con il metodo Receive e ne facciamo l'Encoding indicando il charset da usare (ACII in questo caso) e lo trasformiamo in stringa.

Usciamo dal ciclo, stampiamo il messaggio e ne inviamo uno al client facendo l'operazione inversa e usando il metodo Send.

Infine chiudiamo la seconda Socket e la prima si rimette in attesa.

In pratica la prima Socket si occupa di accettare le connessioni e di tenere in vita il server; la seconda (collegata alla prima) riceve il messaggio e invia la risposta.

Il secondo metodo invece si occupa di chiudere la Socket principale e di spegnere il server; non è un metodo che parte in automatico, ma deve essere richiamato da parte del client.