.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(); // Закрываем сокеты
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д