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

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

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

Люди добрые прошу помощи. У меня есть простенький код сервера с сокетом. Проблема в том, что к серверу может подключиться только один клиент и с ним работать. А если запущу второй, сервер просто будет его игнорировать до тех пор, пока первый не закончит работу.
        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(); //Закрываем сокеты
        }
Это код сервера, запускаю его в Main вот так

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(); // Закрываем сокеты
        }
    }
}

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


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

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

8   голосов , оценка 3.625 из 5
Похожие ответы