Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 10.03.2013
Сообщений: 31
.NET 4.x

Обеспечить возможность подключения к серверу нескольких клиентов

28.05.2015, 15:14. Показов 2923. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди добрые прошу помощи. У меня есть простенький код сервера с сокетом.
Проблема в том, что к серверу может подключиться только один клиент и с ним работать.
А если запущу второй, сервер просто будет его игнорировать до тех пор, пока первый не закончит работу.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        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 клиента и все их сообщения будут выводиться мне на консоль.

Буду очень рад, если кто-то поможет и исправит мой код. Т.к. сам сколько не бился, просто не получается.

Добавлено через 11 часов 12 минут
Никто не знает как сделать несколько потоков в цикле? =(((

Добавлено через 6 часов 3 минуты
Переписал код до такого состояния...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        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(); // Закрываем сокеты
        }
Получается, если первый человек подключится от него я нормально получаю сообщения. Если связь прервётся, программа начинает с большой скоростью логировать что-то и получается чёрный экран. А если потом ещё раз подключится, соединение будет нормальным/стабильным. Только вот в логах - пусто.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.05.2015, 15:14
Ответы с готовыми решениями:

Реализовать возможность подключения к серверу до пяти клиентов
Хотел сделать с помощью ThreadPool но не смог прикрутить к серверу :( И хотелось бы чтобы если 5 уже подключено то сообщение 6-му...

Невозможность подключения клиентов к серверу
Здравствуйте. Проблема заключается в следующем: клиенты не могут подключится к моему серверу (во основном игровой сервер). Установил...

Обеспечить возможность ввода предложений
Здраствуйте. Не могли бы вы мне помочь с заданием. Начало я сделала,ну тоесть создала все эти кнопки,а вот как преобразовать не пойму как....

3
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
28.05.2015, 15:37
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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); // Обозначаем количество ожидающих в очереди на подключение
    while (true)
    {
        Console.WriteLine("Ждем коннекта... {0}", localEndPoint);
        Socket socket = s.Accept(); // Ожидаем подключения
        Thread t = new Thread(new ParameterizedThreadStart(Communicating));
        t.IsBackground = true;
        t.Start(socket);
    }
    s.Close(); // Закрываем сокеты
}
 
static void Communicating(object s)
{
    Socket socket = s as Socket;
    Console.WriteLine("Есть коннект!");
    while (true) // Бесконечность...
    {
        byte[] msg = new byte[socket.Available];
        socket.Receive(msg); // Принимаем Мессагу(пакет)
        Console.WriteLine(Encoding.UTF8.GetString(msg)); // Конвертируем и выводим
    }
    socket.Close(); // Закрываем сокет
}
Учитывайте, что ваши бесконечные циклы не имеют никакой возможности завершиться и все дополнительные потоки будут выполняться бесконечно, равно как и коннект.
2
0 / 0 / 0
Регистрация: 10.03.2013
Сообщений: 31
28.05.2015, 19:28  [ТС]
Хммм. А как-же socket.Close(), s.Close()?
Судя по информации, они должны закрывать сокет.

И у меня пишет только "Ждем коннекта...".
Получается, соединение работает. Но, я не получаю никаких сообщений на консоль.

Может есть пример сервера, куда можно подключить 2 или более клиентов, и мог читать от них сообщения.
Желательно с сокетом и многопоточностью. Т.к. надо работать с каждым клиентом. И по возможности,
можно было выполнять определённые функции, которые мне нужны.

Скажем, подключается 1 пользователь и он работает по своему потоку, и пишет сообщения в консоль(сервера),
а потом подключается ещё один и тоже пишет. И все сообщения выводятся на консоль. А по возможности, хотел бы добавить функцию чтоб если клиент написал слово "Привет", сервер бы смог отправить ответ "Здравствуй".

Как в таком случае переписать код и это реализовать?
0
0 / 0 / 0
Регистрация: 10.03.2013
Сообщений: 31
30.05.2015, 12:37  [ТС]
Пожалуй, напишу точнее, что мне нужно сделать.

У меня есть сервер на сокете, к ему может подключить клиент, и скидывать сообщения.
Но, есть проблема, к серверу может подключиться только один клиент и всё. Если клиент прекращает работу,
сервер крашится с ошибкой. Т.е. сокет не закрывается корректно.

Так вот, мне нужно переписать код так, чтоб к серверу могло подключиться много клиентов.
По мимо этого, была многопоточность и корректно закрывался/открывался новый сокет при подключении/отключении клиентов.

Кликните здесь для просмотра всего текста

Вот код, от сюда беру только клиент.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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;
 
class Program
{
    static void Main(string[] args)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //Создаем основной сокет
        IPAddress ipAddress = null; //IP-адресс
        IPEndPoint Addr = null; //конечная точка(IP и порт)
 
        Console.WriteLine("1 - Server\n2 - Client");
        switch (Console.ReadKey(true).KeyChar)
        {
            case '1':
                Console.Title = "Server"; //Сервер
                //ipAddress = Dns.GetHostEntry("localhost").AddressList[0]; //Преобразовуем адрес или IP узла в массив IP и берем первый
                Addr = new IPEndPoint(IPAddress.Any, 8124); //"localhost" = 127.0.0.1
                s.Bind(Addr); //"Адресуем" сокет
                s.Listen(10); //Обозначаем количество ожидающих в очереди на подключение
                Console.WriteLine("Ждем коннекта...");
                for (int i = 0; i < 10; i++)
                {
                    Socket cl_s = s.Accept(); //Ожидаем подключения
                    Console.WriteLine("YES");
                    Thread ClientThread = new Thread(delegate() { ProcessClient(cl_s); });
                    ClientThread.Start();
                }
            break;
            case '2':
                Console.Title = "Client"; //Клиент
                ipAddress = Dns.GetHostEntry("127.0.0.1").AddressList[0];
                Addr = new IPEndPoint(ipAddress, 8124); //"localhost" = 127.0.0.1
                s.Connect(Addr); //Коннектимся к срверу
                while (true) //Вечная истина :)
                {
                    byte[] msg = Encoding.UTF8.GetBytes(Console.ReadLine()); //Конвертируем
                    s.Send(msg); //Отправляем
                }
            break;
        }
        s.Close(); //Закрываем сокет
        Console.ReadKey();
    }
    static void ProcessClient(Socket cl_s)
    {
        Console.WriteLine("Есть коннект!");
        while (!Console.KeyAvailable) //Пока не нажата клавиша
        {
            byte[] msg = new byte[cl_s.Available];
            cl_s.Receive(msg); //Принимаем МСГ
            Console.WriteLine(Encoding.UTF8.GetString(msg)); //Конвертируем и выводим
        }
        cl_s.Close(); //Закрываем сокет
    }
}
А тут, мой сервер...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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(); // Закрываем сокеты
        }
    }
}


И вот что получаю
Миниатюры
Обеспечить возможность подключения к серверу нескольких клиентов  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.05.2015, 12:37
Помогаю со студенческими работами здесь

Обеспечить возможность ввода RGB - составляющих цвета
Добрый вечер. Задача - Обеспечить возможность ввода RGB-составляющих цвета. При нажатии на кнопку цвет главного окна изменяется на...

Обеспечить возможность ввода в программу только четырехзначных чисел
Начал учить C#! Пишу первую примитивную программу - сумма цифр четырёхзначного числа. Не могу понять в чём дело, постоянно входит в...

Обеспечить возможность отобрать из таблицы только необходимые данные
Обеспечить возможность отобрать из таблицы только необходимые данные. как?

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

Плучить список подключившихся клиентов к серверу
Всем доброго времени суток! Возникла следующая задача: У меня есть сервер, к которому подключается некоторое количество клиентов. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru