Untitled

mail@pastecode.io avatar
unknown
csharp
22 days ago
3.0 kB
0
Indexable
Never
namespace Server
{
    public class Program
    {
        private static TcpListener _tcpListener;
        private static List<ClientInfo> _clients;

        static void Main(string[] args)
        {
            _clients = new List<ClientInfo>();
            StartServer();
            Console.ReadLine();
        }

        public static void StartServer()
        {
            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
            int port = 8888;

            _tcpListener = new TcpListener(ipAddress, port);
            _tcpListener.Start();

            Console.WriteLine("Listening on port 8888.");

            while (true)
            {
                TcpClient client = _tcpListener.AcceptTcpClient();
                Console.WriteLine("Client was connected.");

                NetworkStream stream = client.GetStream();

                byte[] nameBuffer = new byte[4096];
                int nameBytesRead = stream.Read(nameBuffer, 0, 4096);
                string nameClient = Encoding.ASCII.GetString(nameBuffer, 0, nameBytesRead);

                ClientInfo clientInfo = new ClientInfo(nameClient, client);
                _clients.Add(clientInfo);

                Thread clientThread = new Thread(HandleClient);
                clientThread.Start(_clients[_clients.Count - 1]);
            }

            _tcpListener.Stop();
        }

        public static void HandleClient(object clientInfoObject)
        {
            ClientInfo client = (ClientInfo) clientInfoObject;
            TcpClient tcpClient = client.Client;

            NetworkStream stream = tcpClient.GetStream();

            byte[] message = new byte[4096];
            int bytesRead;

            while (true)
            {
                try
                {
                    bytesRead = stream.Read(message, 0, message.Length);
                } catch
                {
                    break;
                }

                if (bytesRead == 0) {
                    break;
                }

                string clientMessage = Encoding.ASCII.GetString(message, 0, bytesRead);
                Console.WriteLine($"{client.Name}: {clientMessage}");

                BroadcastMessage(clientMessage, tcpClient);
            }

            _clients.Remove(client);
            Console.WriteLine($"{client.Name} disconnected.");
            tcpClient.Close();
        }

        private static void BroadcastMessage(string message, TcpClient client)
        {
            foreach (ClientInfo clientInfo in _clients)
            {
                if (clientInfo.Client != client)
                {
                    NetworkStream stream = clientInfo.Client.GetStream();
                    byte[] data = Encoding.ASCII.GetBytes(message);
                    stream.Write(data, 0, data.Length);
                    stream.Flush();
                }
            }
        }
    }
}
Leave a Comment