using System.Net; using System.Net.Sockets; using System.Text; namespace Server; class Program { private const int Porta = 1322; private const int TimeoutLetturaMs = 5 * 60 * 1000; static void Main(string[] args) { Console.WriteLine("Hello, Server!"); TcpListener? listener = null; Encoding utf8SenzaBom = new UTF8Encoding(false); try { IPAddress localAddr = IPAddress.Parse("127.0.0.1"); listener = new TcpListener(localAddr, Porta); listener.Start(); Console.WriteLine("Server avviato."); while (true) { using TcpClient client = listener.AcceptTcpClient(); try { client.ReceiveTimeout = TimeoutLetturaMs; using NetworkStream stream = client.GetStream(); using StreamReader reader = new StreamReader(stream, utf8SenzaBom); using StreamWriter writer = new StreamWriter(stream, utf8SenzaBom); writer.AutoFlush = true; writer.WriteLine("[CONNESSO] Scrivi 'exit' per chiudere"); string? messaggioDalClient; while ((messaggioDalClient = reader.ReadLine()) != null) { Console.WriteLine("[Client] " + messaggioDalClient); if (messaggioDalClient.Trim().ToLower() == "exit") { writer.WriteLine("[ADDIO]"); break; } writer.WriteLine("[SERVER] Messaggio ricevuto -> " + messaggioDalClient); } if (messaggioDalClient == null) { Console.WriteLine("Client è morto"); } } catch (IOException e) { SocketException? causa = e.InnerException as SocketException; if (causa != null && causa.SocketErrorCode == SocketError.TimedOut) { Console.WriteLine("Time out"); } else { Console.WriteLine("Connessione terminata dal server: " + e.Message); } Console.WriteLine(e.Message); } catch (SocketException e) { Console.WriteLine("errore di rete: " + e.Message); switch (e.SocketErrorCode) { case SocketError.ConnectionRefused: Console.WriteLine("Connessione rifiutata dal server"); break; case SocketError.HostNotFound: Console.WriteLine("Host non trovato"); break; case SocketError.TimedOut: Console.WriteLine("Time out"); break; default: Console.WriteLine(e.SocketErrorCode.ToString()); break; } } catch (Exception e) { Console.WriteLine("Errore: " + e.Message); } Console.WriteLine("Connessione terminata"); } } catch (SocketException e) { switch (e.SocketErrorCode) { case SocketError.AddressAlreadyInUse: Console.WriteLine("Indirizzo in uso"); break; case SocketError.AccessDenied: Console.WriteLine("non te lo puoi permettere"); break; default: Console.WriteLine("Errore: " + e.Message); break; } } catch (Exception e) { Console.WriteLine("Errore: " + e.Message); } finally { if (listener != null) { try { listener.Stop(); Console.WriteLine("Server Terminato"); } catch (SocketException e) { Console.WriteLine("Errore nello spegnimento server: " + e.Message); } } Console.WriteLine("Premi un tasto per chiudere"); Console.ReadKey(); } } }