TCP Klient-Serwer

0

Witam, na chwilę dysponuję kodem który umożliwia wysłanie wiadomości do aplikacji pełniącej rolę serwera.
Poniżej zamieszczam kod. Chciałbym aby aplikacja działała w ten sposób: klient łączy się do serwera, serwer zlicza ilu klientów jest aktualnie do niego połączonych, dalej serwer ma wątek który sprawdza parametry i w niektórych przypadkach wysyła do wszystkich klientów informację, po czym jeden z klientów może, ale nie musi obsłużyć daną informację, przez co ponownie komunikuje się z serwerem, aby ten wysłał informacje o tym do pozostałych klientów. Najtrudniejsze jest utrzymanie listy klientów, nie wiem w jaki sposób to realizować?

Kod Serwera:

        public class Client
        {
            TcpClient _client = null;
            byte[] buffer;

            public Client(TcpClient client)
            {
                _client = client;
                buffer = new byte[_client.ReceiveBufferSize];
                _client.GetStream().BeginRead(buffer, 0, _client.ReceiveBufferSize, receiveMessage, null);
            }

            public void receiveMessage(IAsyncResult ar)
            {
                int bytesRead;
                try
                {
                    lock (_client.GetStream())
                    {
                        bytesRead = _client.GetStream().EndRead(ar);
                    }

                    if (bytesRead < 1)
                    {
                        return;
                    }
                    else
                    {
                        string messageReceived = ASCIIEncoding.ASCII.GetString(buffer, 0, bytesRead);
                        MessageBox.Show("Odebrano: " + messageReceived);
                    }
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    //log.Error("Exception in Nasluchiwanie()", ex);
                }
            }
        }

        private void ThreadTaskNasluchiwanie()
        {
            try
            {
                IPAddress ipAddressLis = IPAddress.Parse(tbIpAddress.Text);
                TcpListener listener = new TcpListener(ipAddressLis, PORT_NO);
                listener.Start();

                while (true)
                {
                    Client user = new Client(listener.AcceptTcpClient());
                }
            }
            catch (Exception ex)
            {
                pictureBox1.Image = global::SerwerTerminarz.Properties.Resources.server_error;
                MessageBox.Show(ex.Message);
            }
        }

Kod Klienta:

            IP_ADDRESS = Base.GetValueFromSetting("ip_serwer");
            PORT_NO = Base.GetValueFromSetting("port_serwer");

            string halloServer = "HALLO_SERVER:" + UserLogin.name;

            TcpClient client = new TcpClient(IP_ADDRESS, Convert.ToInt32(PORT_NO));
            byte[] toSend = ASCIIEncoding.ASCII.GetBytes(halloServer);

            NetworkStream nwStream = client.GetStream();
            nwStream.Write(toSend, 0, toSend.Length);
0
Bert1223 napisał(a)

Najtrudniejsze jest utrzymanie listy klientów

Ja bym powiedział że to jest własnie najłatwiejsze. Przechowuj klientów w zwykłej liście typu List<Client>

1 użytkowników online, w tym zalogowanych: 0, gości: 1