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

Клиент-серверное приложение

01.04.2020, 21:52. Показов 3231. Ответов 15

Студворк — интернет-сервис помощи студентам
Всем добрый день(вечер, утро). У меня задача: клиент-серверное приложение. В самом начале работы сервер выбирает устройство из списка доступных (получил я такие устройства, пингуя все ip в локальной сети, ничего умнее не придумал). Теперь я не очень понимаю, как клиенту узнать, к какому серверу подключаться. Возможно, есть какая-нибудь библиотека, которая поможет мне в решении некоторых задач.

Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2020, 21:52
Ответы с готовыми решениями:

Клиент-серверное приложение
Создала клиент-серверное приложение.У меня код клиента в одном проекте,код сервера в другом.Скиньте пример когда клиент и сервер в одном...

Клиент-серверное приложение
Клиент записывает текст в файл и отправляет его серверу. сервер записывает данный текст в обратном порядке записывает в файл и отправляет...

Клиент-Серверное приложение на C#
Доброго времени суток. Возможно я буду не первым кто задает подобны вопрос, но все же: подскажите хорошую литературу с примерами, по...

15
 Аватар для Bampo
114 / 82 / 37
Регистрация: 15.02.2020
Сообщений: 206
02.04.2020, 09:16
EdwardNee,
Цитата Сообщение от EdwardNee Посмотреть сообщение
В самом начале работы сервер выбирает устройство из списка доступных
- это что значит?
Сервер расположен на машине, у которой есть свой IP адрес, который можно либо задать вручную, или получить программно.
Например так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public static string GetLocalIPAddress()
{
    var host = Dns.GetHostEntry(Dns.GetHostName());
    foreach (var ip in host.AddressList)
    {
        if (ip.AddressFamily == AddressFamily.InterNetwork)
        {
            return ip.ToString();
        }
    }
    throw new Exception("Сетевые карты не найдены!");
}
Для клиента, общепринятая практика, когда в клиенте явно указывается ip адрес сервера (и порт, если он может меняться).
1
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 12
02.04.2020, 14:02  [ТС]
Bampo,
Это значит, что сервер может подключиться только к тем устройствам, на которых установлен клиент.
С помощью данного кода я получу ip адрес сетевой карты своего ноутбука? Это еще можно сделать так:
C#
1
2
string Host = Dns.GetHostName();
string IP = Dns.GetHostAddresses(Host)[0].ToString();
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
02.04.2020, 14:15
Цитата Сообщение от EdwardNee Посмотреть сообщение
В самом начале работы сервер выбирает устройство из списка доступных
инициатор подключения всегда клиент
1
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 12
02.04.2020, 14:23  [ТС]
Рядовой, точно. Но как клиентам узнавать, к какому серверу подключаться? Я думал, отправлять с клиента на все локальные машины сообщение, и тот, что отреагирует - сервер. Но это будет очень медленно. Есть ли какая то возможность серверу заявить о себе?
0
 Аватар для Bampo
114 / 82 / 37
Регистрация: 15.02.2020
Сообщений: 206
02.04.2020, 14:36
EdwardNee,
Цитата Сообщение от EdwardNee Посмотреть сообщение
string IP = Dns.GetHostAddresses(Host)[0].ToString();
Современные ОС могут содержать несколько сетевых адаптеров (ipv4 ipv6, виртуальные), поэтому Dns.GetHostAddresses(Host)[0] может оказаться совсем не то, что нужно. Но можно биндить сервер сразу ко всем адресам(0.0.0.0).

Цитата Сообщение от EdwardNee Посмотреть сообщение
Но как клиентам узнавать, к какому серверу подключаться?
Надо указывать адрес в клиенте вручную - в конфиге или поле ввода.
Сканировать сеть тоже можно, но это работает только внутри локальной сети и имеет смысл если адрес сервера не известен заранее, почему-то.
1
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 12
02.04.2020, 14:43  [ТС]
Bampo,
Цитата Сообщение от Bampo Посмотреть сообщение
Надо указывать адрес в клиенте вручную - в конфиге или поле ввода.
Но это же будет странно и неудобно, если пользователь будет вводить ip адрес сервера, к которому подключаться.
0
 Аватар для Bampo
114 / 82 / 37
Регистрация: 15.02.2020
Сообщений: 206
02.04.2020, 14:47
EdwardNee,
1) если адрес сервера постоянный, то можно "зашить" в клиенте или сохранить его в конфигурации после первого ввода.
2) если ip адрес меняется, то можно указывать dns имя, которое обычно не меняется.
а насчет странности - тогда странно, что этот подход используется в браузерах
1
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
02.04.2020, 14:48
EdwardNee, Адрес у сервера всегда один. Если вам такое решение не подходит, опишите свою задачу
1
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 12
02.04.2020, 15:31  [ТС]
Рядовой, Bampo,

Все устройства находятся в одной сети.
Компьютер - сервер. У него есть список устройств(телефоны - клиенты), которые могут с ним взаимодействовать. На компьютере выбирается одно устройство(в идеале несколько, но мне бы с одним разобраться) и с ним устанавливается соединение. Притом, сервером может быть другой компьютер и клиентами могут быть другие телефоны => ip адреса у них у всех другие.

Добавлено через 25 минут
А если с каждого клиента будет отправлять сообщение и тот, что откликнется - сервер и завершать поиск. Далее выбирается с кем взаимодействовать. Но это будет долго.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
02.04.2020, 15:46
Цитата Сообщение от EdwardNee Посмотреть сообщение
сервером может быть другой компьютер
чем обусловлено это требование?
0
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 12
02.04.2020, 15:49  [ТС]
Рядовой,
Цитата Сообщение от Рядовой Посмотреть сообщение
чем обусловлено это требование?
Приложение такое, что сервером и клиентом могут быть разные устройства, не одни и те же компьютеры и телефоны.
0
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
02.04.2020, 15:53
EdwardNee,
.. в клиент-серверных приложениях клиенты посылают запросы, а сервер (между прочим, это слово проиходит от слова "обслуживание", а не "начальник" ... ) отвечает .. вы пытаетесь выдумать то, что давно придумано ...
1
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
02.04.2020, 16:14
EdwardNee, тогда это не клиент-серверное приложение, а p2p
https://professorweb.ru/my/csh... l8/8_1.php
https://professorweb.ru/my/csh... l8/8_3.php
1
 Аватар для Bampo
114 / 82 / 37
Регистрация: 15.02.2020
Сообщений: 206
03.04.2020, 11:03
EdwardNee, при любой схеме с динамическими адресами хостов, если не хочется делать перебор всех IP в подсети, то необходимо иметь один всем известный адрес сервера, чтобы на него все динамические хосты могли прислать информацию о себе.
Если все же перебор, то схема такая - на компьютере сервер, с известным открытым портом, например, 9999. Программа на телефоне, при старте начинает открывать соединение на этот порт с каждым хостом из своей подсети, кроме xxx.xxx.xxx.0,255 и своего адреса. Только таймаут соединения нужно поставить маленький, чтобы при неудаче коннект не долго зависал. И запускать на сканирование сразу несколько потоков. Если соединение на порт установилось, надо проверить, что это твой сервер, а не чужой, с таки же портом.
1
0 / 0 / 0
Регистрация: 22.01.2020
Сообщений: 12
05.05.2020, 04:42  [ТС]
Bampo, Рядовой, Не могли бы вы мне помочь. До сих пор не разобрался с подключением(
Пытаюсь отправить Broadcast сообщение, но что-то не так. (Все происходит в Unity)
Клиент:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Start(){
            localIp = InitLocalIp();
            Socket sock = new Socket(AddressFamily.InterNetwork,
                SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, 1556);
            sock.Bind(iep);
            EndPoint ep = (EndPoint)iep;
            Debug.Log("Ready to receive...");
 
            byte[] data = new byte[1024];
            int recv = sock.ReceiveFrom(data, ref ep);
            string stringData = Encoding.ASCII.GetString(data, 0, recv);
            Debug.Log($"received: {stringData}  from: {ep}");
 
            sock.SendTo(Encoding.ASCII.GetBytes(localIp), ep);
}
    static string InitLocalIp()
    {
        string Host = Dns.GetHostName();
        string IP = Dns.GetHostAddresses(Host)[0].ToString();
        return IP;
    }
И сервер:
C#
1
2
3
4
5
6
7
8
9
            UdpClient udp = new UdpClient();
            int GroupPort = 1556;
            IPEndPoint groupEP = new IPEndPoint(IPAddress.Broadcast, GroupPort);    //Parse("255.255.255.255")
            string str4 = "Is anyone out there?";
            byte[] sendBytes4 = Encoding.ASCII.GetBytes(str4);
            udp.Send(sendBytes4, sendBytes4.Length, groupEP);
            byte[] receiveBytes = udp.Receive(ref groupEP);
            string returnData = Encoding.ASCII.GetString(receiveBytes);
            Debug.Log("Response: " + returnData);
Тестирую подключение на двух андроид-устройствах.
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.05.2020, 04:42
Помогаю со студенческими работами здесь

Клиент-серверное приложение
Здарвствуйте уважаемые форумчане, есть такое приложение (создано исключительно для теста соединения): using System; using...

Клиент-серверное приложение
Как создать Клиент-серверное приложение чтоби бил 1 сервер и возможность подключения к нему нескольким клиентам Желательно пример в форме.

Клиент-серверное приложение
Народ, у меня не хочет работать приложение. Скажите, что я делаю не так? Будет здорово, если мой код поправите. Сервер каждые 100...

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

Реализовать клиент серверное приложение
Здраствуйте,дали задание реализовать клиент серверное приложение: Реализовать с клиента: просмотр словаря по алфавиту, поиск введенного...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru