Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
1

Пример обмена данными между приложениями с использованием .net remoting

07.04.2017, 18:00. Показов 5605. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.
Есть два приложения WindowsForms одно посылает в порт массив байт определённой структуры по UDP-протоколу, другое (на другом сетевом компьютере) принимает из порта этот массив байт (разумеется используя UDP-протокол и тот же порт), "расшифровывает" его и выводит данные на экран.
Услышал, что для этой задачи можно использовать .net remoting. Встретившиеся мне примеры, к сожалению, приведены только для консолей и в них одно приложение запускается из другого. Примера обмена данными между двумя абсолютно независимыми и запускаемыми (останавливаемыми) в разное время приложениями Windows Forms не нашёл. Возможно я чего-то не понял и .net remoting существует не для моей задачи?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2017, 18:00
Ответы с готовыми решениями:

Пример обмена данными между приложениями с использованием WCF
Всем здравствуйте. Нужен простой пример по использованию WCF. 1. Есть Windows Forms с таймером,...

Реализация обмена данными между серверным и клиентским приложениями
Подскажите правильный и простой (насколько возможно) способ отправления данных и запроса метода от...

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

Обмен данными между приложениями
Добрый день! Есть 2 моих отдельных друг от друга приложения, нужно из одного отправить строку в...

11
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.04.2017, 22:13 2
jkrnd,
1) remoting это устаревшая технология. Она и раньше не особо использовалась, а сейчас и подавно. Вместо нее сейчас - WCF.
2) remoting это гораздо более высокоуровневая технолгия чем UDP/TCP. И совсем непонятно зачем вам она для "обмена данными". Тем более, если ваше приложение уже работает, то непонятно какую задачу remoting вам решит.
3) remoting работает как в консоли так и в winforms. И вообще это не зависит от типа приложения.
1
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
09.04.2017, 07:01  [ТС] 3
Цитата Сообщение от Storm23 Посмотреть сообщение
Вместо нее сейчас - WCF.
пример для двух WindowsForm Application можно
Цитата Сообщение от Storm23 Посмотреть сообщение
если ваше приложение уже работает, то непонятно какую задачу remoting вам решит.
в дальнейшем использовать для решения задачи современный подход.
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
09.04.2017, 10:49 4
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от jkrnd Посмотреть сообщение
пример для двух WindowsForm Application можно
Сначала создаем контракт. Это интерфейс, методы которого может выполнять сервер:
C#
1
2
3
4
5
6
7
8
9
namespace Contract
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        void Hello(string name);
    }
}
Здесь контракт содержит только один метод Hello, который принимает на вход строку. Контракт оформляется в виде отдельного проекта.

Далее, создаем отдельное winforms приложение с сервером:
Кликните здесь для просмотра всего текста
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
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
            //создаем сервис
            var service = new ServiceImplementation();
 
            //подписываемся на событие HelloReceived
            service.HelloReceived += Service_HelloReceived;
 
            //стартуем сервер
            var svh = new ServiceHost(service);
            svh.AddServiceEndpoint(typeof(Contract.IService), new NetTcpBinding(), "net.tcp://localhost:8000");
            svh.Open();
        }
 
        private void Service_HelloReceived(object sender, string name)
        {
            //принимаем строку от клиента, выводим в tbMessages
            tbMessages.AppendText(DateTime.Now +": " + name + "\r\n");
        }
    }
 
    /// <summary>
    /// Реализация сервиса
    /// </summary>
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    class ServiceImplementation : Contract.IService
    {
        public event EventHandler<string> HelloReceived = delegate { };
 
        public void Hello(string name)
        {
            //вызываем событие HelloReceived
            HelloReceived(this, name);
        }
    }


Класс ServiceImplementation реализует контракт IService, и по сути является классом, который будет обрабатывать запросы клиентов. В ServiceImplementation реализовано событие HelloReceived, которое срабатывает тогда, когда клиент присылает строку через метод Hello. Это событие нужно для того, что бы мы могли автоматически обновить интерфейс приложения, когда поступит новый запрос от клиента.

И наконец сам клиент также оформляем в виде отдельного winforms приложения:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public partial class Form1 : Form
    {
        Contract.IService service;
 
        public Form1()
        {
            InitializeComponent();
 
            //создаем клиент
            var scf = new ChannelFactory<Contract.IService>(new NetTcpBinding(), "net.tcp://localhost:8000");
            service = scf.CreateChannel();
        }
 
        private void btSend_Click(object sender, EventArgs e)
        {
            //вызываем метод Hello на сервере, передаем строку из tbText
            service.Hello(tbText.Text);
        }
    }


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

Клиент и сервер сконфигурированы для работы на одном компьютере. Разумеется, если сервер работает на другом хосте, то вместо localhost нужно указывать адрес сервера.

Пример обмена данными между приложениями с использованием .net remoting
Вложения
Тип файла: zip WindowsFormsApplication369.zip (121.8 Кб, 67 просмотров)
1
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
09.04.2017, 11:22  [ТС] 5
Storm23, спасибо. Я надеюсь возможен вариант: один клиент (раздаёт массив байтов всем кто подписан на контракт) и несколько серверов (принимающих эти байты по контракту), причём как клиенты так и серверы могут свободно запускаться и останавливаться, то есть никаких особых операций, посылки запросов на соединение и прочее не нужно?
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
09.04.2017, 11:29 6
Цитата Сообщение от jkrnd Посмотреть сообщение
причём как клиенты так и серверы могут свободно запускаться и останавливаться
Да, клиенты и серверы могут свободно запускаться и останавливаться.
Цитата Сообщение от jkrnd Посмотреть сообщение
Я надеюсь возможен вариант: один клиент (раздаёт массив байтов всем кто подписан на контракт) и несколько серверов (принимающих эти байты по контракту)
WCF это огромная система, там очень много разных возможностей.

Тут есть господин insite2012, он фанат WCF, я думаю он вам сможет разъяснить более подробно
Кроме того, есть отдельный раздел форума для WCF.
1
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.04.2017, 13:15 7
Цитата Сообщение от Storm23 Посмотреть сообщение
он фанат WCF, я думаю он вам сможет разъяснить более подробно
Да без проблем.
jkrnd, поставьте задачу более конкретно. Сделаю вам пример.
1
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
09.04.2017, 16:35  [ТС] 8
Цитата Сообщение от insite2012 Посмотреть сообщение
поставьте задачу более конкретно
не воспользоваться таким предложением не могу
Есть локальная сеть. На одном из компьютеров (источнике данных для других компьютеров) происходит считывание текущей даты (DateTime, 8 байт). (Реально на нём происходит опрос контроллера и заполняется структура в виде теущей даты и массива float-величин) . Задача на другом компьютере сети (или localhost) принимать эти байты и отображать на форме своего приложения в метке в виде отформатированной даты (обязательно включая секунды чтобы увидеть ход процесса). Обмен данными в таймере 1-2 раза в секунду не реже. Принимающих данные программ может быть несколько. Они могут находится на одном и том же компьютере, произвольно запускаться, выгружаться. При остановке программы источника данных не должно быть "вылетов" принимающих данные программ.

Не по теме:

Совсем недавно это реализовывалось мною через запись-чтение в двоичный файл определённой структуры (с 1996 года!). В прошлом году я познакомился с .NET и с помощью форумчан перевёл всё это на UDP-обмен. Всё отлично работает, но есть и ограничения. Например, запуская несколько серверов (читающих из порта) на одном компьютере приходится менять порты обмена. Ну и вообще, хотелось бы использовать передовые технологии.

0
Storm23
09.04.2017, 17:12
  #9

Не по теме:

Цитата Сообщение от jkrnd Посмотреть сообщение
хотелось бы использовать передовые технологии
Лучшее - враг хорошего.

0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.04.2017, 17:15 10
jkrnd, тогда архитектура примерна такая.
Основной компьютер - это хост службы с поддержкой контрактов обратного вызова. Каждый из клиентов при запуске коннектится с хостом и подписывается на его обратные вызовы. Хост по команде может начинать и останавливать передачу, и все клиенты, кто в данный момент присоединен к хосту, получают от него данные и отображают у себя.
Последний пункт вашего требования можно реализовать через периодический опрос хоста на ответ.
Это один вариант.
Вариант 2. Тот же хост, но без обратных вызовов. Хост просто читает данные и хранит их. Клиенты периодически опрашивают хост (по таймеру) и получают данные. Последний пункт реализуется через систему автообнаружения WS Discovery (то есть, если хост не в сети, то и запрос не производится).
Какой из вариантов вас больше устраивает?
1
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
10.04.2017, 14:36  [ТС] 11
insite2012, Вариант 2
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
10.04.2017, 16:46 12
Цитата Сообщение от jkrnd Посмотреть сообщение
Вариант 2
Значит будет вам вариант 2.
1
10.04.2017, 16:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2017, 16:46
Помогаю со студенческими работами здесь

Обмен данными между приложениями по Wi-Fi
Доброго времени суток. Подскажите пожалуйста как сделать программу которая будет работать на 2-х...

Технология обмен данными между приложениями
Приветствую профессионалов и любителей программирования! Принимайте новичка. Собственно такой...

Универсальный обмен данными между приложениями
Посоветуйте, пожалуйста, подход для решения следующей штуки: Передача данных из приложенияА (C#) в...

Обмен данными между двумя приложениями
есть 2 приложения. Приложение 1 - Создает Приложение 2 с помощью CreateProcess(); следовательно...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru