5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
1 | |
Сетевое приложение, которое будет автоматически находить свои запущенные экземпляры в локальной сети08.04.2019, 16:28. Показов 2833. Ответов 19
Задание такое:
Написать программу, которая будет автоматически находить свои запущенные экземпляры в локальной сети и подключаться к ним для передачи текстовых сообщений. Есть у кого-нибудь идеи? Как это реализовать?
0
|
08.04.2019, 16:28 | |
Ответы с готовыми решениями:
19
Необходимо создать приложение, которое будет автоматически обновляться с API Разработать приложение, которое будет автоматически выдавать случайные фразы Доступ к файлу Write и Read (Серверное приложение которое будет принимать данные из сети и записывать в XML) Комп перестал видеть сетевую карту и сетевое подключение к локальной сети |
23.05.2019, 13:58 | 2 | ||||||||||||||||||||
Сообщение было отмечено kzkmrf2010 как решение
Решение
Будем использовать UDP протокол для передачи данных.
Для построения списка клиентов - каждый экземпляр будет регулярно отправлять пустые сообщения (heartbeat). Для отправки/приема сообщения будем использовать асинхронные методы BeginReceive/EndReceive и BeginSend/EndSend из UdpClient. Сначала создадим класс Host, который будет хранить информацию об удаленном хосте (IP адрес и время получения последнего heartbeat):
Также сделаем высокоуровневый класс Controller, который будет хранить в себе сервер, список удаленных хостов, будет принимать сигналы heartbeat и строить список онлайн хостов. Также этот класс будет содержать методы для отправки сообщения и событие приема сообщений:
2
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
23.05.2019, 17:24 [ТС] | 3 |
Storm23, а что надо сделать для переработки этого решения под tcp протокол?
0
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
23.05.2019, 22:53 [ТС] | 5 |
Storm23, извините, решение полностью соответствует задаче, просто нужна реализация на tcp
0
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|
23.05.2019, 23:55 | 6 |
TCP совершенно не подходит для этой задачи, по крайней мере в одиночку
единственный вариант это банально сканировать диапазон сети и стучаться к каждому адресу, это жутко неэффективно и бессмысленно
1
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
24.05.2019, 00:02 [ТС] | 7 |
m0nax, к сожаление, задание по tcp, подходит или нет, не мне решать(
0
|
24.05.2019, 00:28 | 8 | |||||
Сообщение было отмечено kzkmrf2010 как решение
Решение
По аналогии с классом Server, создаем класс ClientServerTCP:
В класс Controller добавляем поле ClientServerTCP и стартуем его при старте контроллера, аналогично старту Server. Также в класс Controller добавляем метод SendMessage который будет передавать данные по TCP на конкретный хост. Теперь класс Controller может передавать как широковещательные сообщения по UDP, так и сообщения на определенный хост по TCP. Нахождение клиентов друг друга по прежнему делается через heartbeats по UDP. Далее, немного изменяем интерфейс. Создадим чекбокс Broadcast. Если Broadcast = false, то сообщение будет отправляться по TCP на хост, выделенный в списке слева. Если же Broadcast = true, то сообщения будут отправляться всем клиентам по UDP.
1
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
24.05.2019, 17:14 [ТС] | 9 |
0
|
24.05.2019, 17:55 | 10 |
Ну вам уже выше писали, что TCP не подходит для таких дел. Можно как-то извращаться, но UDP в данном случае - оптимальный вариант. То, что вашему преподу хочется странного - не повод делать плохие вещи.
1
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
28.05.2019, 20:27 [ТС] | 11 |
Storm23,
Можно подробнее описать эту строчку? Инкапсулирует метод...Для чего она вообще нужна?
Добавлено через 21 минуту Storm23, И почему где-то нам надо знать состояние асинхронной операции, а где-то null? Добавлено через 33 минуты Storm23, Можно как-нибудь подробнее расписать эту строку? Добавлено через 7 минут Storm23, Для чего нам lock? Добавлено через 49 секунд здесь Добавлено через 21 минуту и какие два ip мы сравниваем?
0
|
29.05.2019, 23:10 | 12 |
Для того что бы не проверять событие на null при его вызове. Смотрите здесь https://stackoverflow.com/ques... -of-c#9282
Я не знаю о чем вы, приводите фрагменты кода. Я не знаю, что там непонятного. Мы просим tcpclient приконектится к удаленному порту. Когда он приконектится - вызовется метод OnTCPConnected. Для понимания конструкции с "=>" читайте про лямбды в C#. Потому, что когда мы работаем с асинхронными сокетами, все события происходят в разных потоках. Поэтому нужно использовать синхронизации при доступе к общим ресурсам. Здесь ищется Host, IP которого равен remoteIP. kzkmrf2010, Все ответы на ваши вопросы можно найти в учебнике C#.
1
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
30.05.2019, 14:40 [ТС] | 13 |
Storm23, спасибо большое за ваши ответы.
Как можно разбить программу на две части. Т.е. сервер udp отправляет запрос по локальной сети (один раз) "кто здесь?". Клиенты отвечают ему "я здесь" и отправляют серверу свой ip. Дальше формируется список ip. После клиенты находятся в режиме ожидания "слушают"(на tcp). Сервер уже по tcp отправляет каждому клиенту сообщение, например, "я тебя вижу". Добавлено через 4 часа 27 минут Storm23, благодаря Вам, я стала намного лучше разбираться с клиент-серверными приложениями. Начали интересовать различные варианты. Извините, что задаю так много вопросов.
0
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
30.05.2019, 18:14 [ТС] | 15 |
Storm23, нуу если бы мне это не составило труда, я б здесь не просила...
Добавлено через 49 минут Storm23, вы сможете помочь еще раз?
0
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|||||||||||||||||||||
01.06.2019, 20:44 [ТС] | 16 | ||||||||||||||||||||
Storm23, Вроде как справилась, единственное вылетает ошибка "Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение 192.168.0.2:45450"
Если несложно, посмотрите код пожалуйста. Сервер:
Ошибка пропадает, и всё работает, если методы
0
|
02.06.2019, 09:51 | 17 |
Во-первых, это совсем не логично. Клиент - это тот кто начинает обмен данными, Сервер - тот кто отвечает на запрос клиента.
Во-вторых, у вас тут нет разделения на клиенты и сервера, потому что у вас peer-to-peer. Оба хоста являются одновременно и клиентами и серверами. Ну а ошибка понятно почему падает. Вы же зачем то кусок кода перенесли в другой класс, а там порт другой, вот оно и не может приконектится. У вас для UDP - должен быть порт 45450, а для TCP - 45451.
1
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
02.06.2019, 12:12 [ТС] | 18 |
слепня потому что, поэтому и не увидела. Последний вопрос, можно ли как-то прописать алгоритм, чтобы сервер по порядку подключался к найденным адресам и автоматически отправлял введенное сообщение, т.е. без выделения адреса вручную в FastTree.
0
|
02.06.2019, 15:38 | 19 |
Конечно можно. У вас есть список Host, перебирайте их по одному и отправляйте каждому.
Хотя изначально оно же по UDP всем и отправляло, вы глупостью какой-то занимаетесь.
0
|
5 / 4 / 1
Регистрация: 28.11.2017
Сообщений: 38
|
|
02.06.2019, 15:40 [ТС] | 20 |
Storm23, может и глупостью, но дано задание, которое надо выполнить... То что надо перебирать Host, я понимаю. Может подскажете каким способом.
0
|
02.06.2019, 15:40 | |
02.06.2019, 15:40 | |
Помогаю со студенческими работами здесь
20
Создать приложение, которое будет запускать Word Приложение, которое будет на ПК уведомлять об уведомлениях на телефоне Приложение для анкетирования в локальной сети Клиентское приложение + БД (ORACLE) в локальной сети Generic Host Process for Win32 Services-обнаружена ошибка. Приложение будет закрыто. Приносим свои извинения Приложение, которое будет выводить изображения (фотографии) как в галерее Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |