Как сделать сервер C#?

Здравствуйте! Есть код на C# приложения сервер-клиент.
Вот код сервера:
class ClientObject
spoiler
public TcpClient client;
        public ClientObject(TcpClient tcpClient)
        {
            client = tcpClient;
        }

        public void Process()
        {
            NetworkStream stream = null;
            try
            {
                stream = client.GetStream();
                byte[] data = new byte[64]; // буфер для получаемых данных
                while (true)
                {
                    // получаем сообщение
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    do
                    {
                        bytes = stream.Read(data, 0, data.Length);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (stream.DataAvailable);

                    string message = builder.ToString();

                    Console.WriteLine(message);
                    Console.WriteLine("/");
                    // отправляем обратно сообщение в верхнем регистре
                    message = Console.ReadLine();
                    
                        data = Encoding.Unicode.GetBytes(message);
                    
                        stream.Write(data, 0, data.Length);
                    
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (stream != null)
                    stream.Close();
                if (client != null)
                    client.Close();
            }
        }

class Program
spoiler
const int port = 8888;
        static TcpListener listener;
        static void Main(string[] args)
        {
            try
            {
                listener = new TcpListener(port);
                listener.Start();
                Console.WriteLine("Ожидание подключений...");
                
                TcpClient client = listener.AcceptTcpClient();
                ClientObject clientObject = new ClientObject(client);
                Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
                clientThread.Start();
            
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (listener != null)
                    listener.Stop();
            }
        }


А вот сам клиент:

class Program
spoiler
const int port = 8888;
        const string address = "127.0.0.1";
        static void Main(string[] args)
        {
            Console.Write("Введите свое имя:");
            string userName = Console.ReadLine();
            TcpClient client = null;
            
                client = new TcpClient(address, port);
                NetworkStream stream = client.GetStream();

                while (true)
                {
                    Console.Write(userName + ": ");
                    // ввод сообщения
                    string message = Console.ReadLine();
                    message = String.Format("{0}: {1}", userName, message);
                    // преобразуем сообщение в массив байтов
                    byte[] data = Encoding.Unicode.GetBytes(message);
                    // отправка сообщения
                    stream.Write(data, 0, data.Length);
                    // получаем ответ
                    data = new byte[64]; // буфер для получаемых данных
                    StringBuilder builder = new StringBuilder();
                    int bytes = 0;
                    do
                    {
                        bytes = stream.Read(data, 0, data.Length);
                        builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                    }
                    while (stream.DataAvailable);

                    message = builder.ToString();
                    Console.WriteLine("Сервер: {0}", message);
                }
            
        }

Сама суть проблемы..
Дело в том, что когда я подключаюсь к серверу через клиент, сервер запускает под это соединение поток.. Когда же запускаешь еще один клиент, выходит еще один тред, тем самым из-за этого я не могу единоразово отправить на все клиенты одно и то же сообщение. То есть когда ввожу, сначала отправляется на первый подключенный клиент, когда ввожу второй раз, на второй кидается итд..

Подскажите пож-ста как решить такую проблемку
  • Вопрос задан
  • 345 просмотров
Пригласить эксперта
Ответы на вопрос 2
petermzg
@petermzg
Самый лучший программист
Так не создавайте отдельные потоки под каждое новое клиентское подключение.
Сохраняйте подключения в массив и когда будет неоходимо отсылайте данные во все сохраненные подключения.
Ответ написан
@RomarioSPb
https://metanit.com/sharp/net/4.2.php - вроде все доступно написано, вдруг поможет.
Можно как вариант использовать асинхронный TcpListener и не заморачиваться с сокетами
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы