.NET 4.x Обеспечить возможность подключения к серверу нескольких клиентов - C#

Узнай цену своей работы

Формулировка задачи:

Люди добрые прошу помощи. У меня есть простенький код сервера с сокетом. Проблема в том, что к серверу может подключиться только один клиент и с ним работать. А если запущу второй, сервер просто будет его игнорировать до тех пор, пока первый не закончит работу.
Листинг программы
  1. static Connect()
  2. {
  3. Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Создаем основной сокет
  4. IPAddress ipAddress = null; //IP-адресс
  5. IPEndPoint Addr = null; //конечная точка(IP и порт)
  6. Addr = new IPEndPoint(IPAddress.Any, 8124); //"localhost" = 127.0.0.1
  7. s.Bind(Addr); //"Адресуем" сокет
  8. s.Listen(10); //Обозначаем количество ожидающих в очереди на подключение
  9. Console.WriteLine("Ждем коннекта...");
  10. Socket socket = s.Accept(); //Ожидаем подключения
  11. Console.WriteLine("Есть коннект!");
  12. while (Console.KeyAvailable) //Пока не нажата клавиша
  13. {
  14. byte[] msg = new byte[socket.Available];
  15. socket.Receive(msg); //Принимаем МСГ
  16. Console.WriteLine(Encoding.UTF8.GetString(msg)); //Конвертируем и выводим
  17. }
  18. socket.Close(); //Закрываем сокет
  19. s.Close(); //Закрываем сокеты
  20. }
Это код сервера, запускаю его в Main вот так

Connect conn = new Connect();

Как я понял, мне нужно Socket socket = s.Accept(); сделать циклом и сделать так, чтоб всё передавалось в новый поток. Тем самым, я могу запустить хоть 3 клиента и все их сообщения будут выводиться мне на консоль. Буду очень рад, если кто-то поможет и исправит мой код. Т.к. сам сколько не бился, просто не получается.
Никто не знает как сделать несколько потоков в цикле? =(((
Переписал код до такого состояния...
Листинг программы
  1. static Connect()
  2. {
  3. Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Создаем основной сокет
  4. IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1"); // Пишем IP адрес
  5. IPAddress ipAddress = ipHostInfo.AddressList[0];
  6. IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8124); // Указываем порт
  7. s.Bind(localEndPoint); // "Адресуем" сокет
  8. s.Listen(10); // Обозначаем количество ожидающих в очереди на подключение
  9. Console.WriteLine("Ждем коннекта... {0}", localEndPoint);
  10. Socket socket = s.Accept(); // Ожидаем подключения
  11. Console.WriteLine("Есть коннект!");
  12. while (true) // Бесконечность...
  13. {
  14. byte[] msg = new byte[socket.Available];
  15. socket.Receive(msg); // Принимаем Мессагу(пакет)
  16. Console.WriteLine(Encoding.UTF8.GetString(msg)); // Конвертируем и выводим
  17. }
  18. socket.Close(); // Закрываем сокет
  19. s.Close(); // Закрываем сокеты
  20. }
Получается, если первый человек подключится от него я нормально получаю сообщения. Если связь прервётся, программа начинает с большой скоростью логировать что-то и получается чёрный экран. А если потом ещё раз подключится, соединение будет нормальным/стабильным. Только вот в логах - пусто.

Решение задачи: «.NET 4.x Обеспечить возможность подключения к серверу нескольких клиентов»

textual
Листинг программы
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Net;
  8. using System.Net.Sockets;
  9. using System.Threading;
  10. using System.Timers;
  11.  
  12. namespace SocketServer
  13. {
  14.     class Program
  15.     {
  16.         static void Main(string[] args)
  17.         {
  18.             // Free memory...
  19.             GC.Collect();
  20.             Console.WriteLine("Всего памяти: {0}", GC.GetTotalMemory(false));
  21.  
  22.             // SocketServer
  23.             Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Создаем основной сокет
  24.             IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1"); // Пишем IP адрес
  25.             IPAddress ipAddress = ipHostInfo.AddressList[0];
  26.             IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8124); // Указываем порт
  27.             s.Bind(localEndPoint); // "Адресуем" сокет
  28.             s.Listen(10); // Обозначаем количество ожидающих в очереди на подключение
  29.             Console.WriteLine("Ждем коннекта... {0}", localEndPoint);
  30.             Socket socket = s.Accept(); // Ожидаем подключения
  31.             Console.WriteLine("Есть коннект!");
  32.             while (true) // Бесконечность...
  33.             {
  34.                 byte[] msg = new byte[socket.Available];
  35.                 socket.Receive(msg); // Принимаем Мессагу(пакет)
  36.                 Console.WriteLine(Encoding.UTF8.GetString(msg)); // Конвертируем и выводим
  37.             }
  38.             socket.Close(); // Закрываем сокет
  39.             s.Close(); // Закрываем сокеты
  40.         }
  41.     }
  42. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы