.NET 4.x Обеспечить возможность подключения к серверу нескольких клиентов - C#
Формулировка задачи:
Люди добрые прошу помощи. У меня есть простенький код сервера с сокетом.
Проблема в том, что к серверу может подключиться только один клиент и с ним работать.
А если запущу второй, сервер просто будет его игнорировать до тех пор, пока первый не закончит работу.
Это код сервера, запускаю его в Main вот так Получается, если первый человек подключится от него я нормально получаю сообщения. Если связь прервётся, программа начинает с большой скоростью логировать что-то и получается чёрный экран. А если потом ещё раз подключится, соединение будет нормальным/стабильным. Только вот в логах - пусто.
static Connect() { Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Создаем основной сокет IPAddress ipAddress = null; //IP-адресс IPEndPoint Addr = null; //конечная точка(IP и порт) Addr = new IPEndPoint(IPAddress.Any, 8124); //"localhost" = 127.0.0.1 s.Bind(Addr); //"Адресуем" сокет s.Listen(10); //Обозначаем количество ожидающих в очереди на подключение Console.WriteLine("Ждем коннекта..."); Socket socket = s.Accept(); //Ожидаем подключения Console.WriteLine("Есть коннект!"); while (Console.KeyAvailable) //Пока не нажата клавиша { byte[] msg = new byte[socket.Available]; socket.Receive(msg); //Принимаем МСГ Console.WriteLine(Encoding.UTF8.GetString(msg)); //Конвертируем и выводим } socket.Close(); //Закрываем сокет s.Close(); //Закрываем сокеты }
Connect conn = new Connect();
Как я понял, мне нужно Socket socket = s.Accept(); сделать циклом и сделать так, чтоб всё передавалось в новый поток. Тем самым, я могу запустить хоть 3 клиента и все их сообщения будут выводиться мне на консоль. Буду очень рад, если кто-то поможет и исправит мой код. Т.к. сам сколько не бился, просто не получается.
Никто не знает как сделать несколько потоков в цикле? =(((
Переписал код до такого состояния...
static Connect() { Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Создаем основной сокет IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1"); // Пишем IP адрес IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8124); // Указываем порт s.Bind(localEndPoint); // "Адресуем" сокет s.Listen(10); // Обозначаем количество ожидающих в очереди на подключение Console.WriteLine("Ждем коннекта... {0}", localEndPoint); Socket socket = s.Accept(); // Ожидаем подключения Console.WriteLine("Есть коннект!"); while (true) // Бесконечность... { byte[] msg = new byte[socket.Available]; socket.Receive(msg); // Принимаем Мессагу(пакет) Console.WriteLine(Encoding.UTF8.GetString(msg)); // Конвертируем и выводим } socket.Close(); // Закрываем сокет s.Close(); // Закрываем сокеты }
Решение задачи: «.NET 4.x Обеспечить возможность подключения к серверу нескольких клиентов»
textual
Листинг программы
using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Diagnostics; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; using System.Timers; namespace SocketServer { class Program { static void Main(string[] args) { // Free memory... GC.Collect(); Console.WriteLine("Всего памяти: {0}", GC.GetTotalMemory(false)); // SocketServer Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Создаем основной сокет IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1"); // Пишем IP адрес IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8124); // Указываем порт s.Bind(localEndPoint); // "Адресуем" сокет s.Listen(10); // Обозначаем количество ожидающих в очереди на подключение Console.WriteLine("Ждем коннекта... {0}", localEndPoint); Socket socket = s.Accept(); // Ожидаем подключения Console.WriteLine("Есть коннект!"); while (true) // Бесконечность... { byte[] msg = new byte[socket.Available]; socket.Receive(msg); // Принимаем Мессагу(пакет) Console.WriteLine(Encoding.UTF8.GetString(msg)); // Конвертируем и выводим } socket.Close(); // Закрываем сокет s.Close(); // Закрываем сокеты } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д