2013-10-08 3 views
0

This question спросил, как связывать запросы и получать ответы. Я тоже хочу отправлять запросы на действия и информацию. Некоторые из этих запросов будут принимать параметры, большинство - нет. И ответов, почти все отправят «ОК», но другие отправят мне информацию. Два конца ссылки ничего не знают друг о друге, кроме этого командного протокола. ОП получил свой ответ, сказав ему, как обернуть его код.C# блокирование ожидание ответа, снова

Я был поражен такими ответами, рассказывающими, какие технологии использовать, как обернуть код и т. Д .; и поскольку я делаю совершенно новую разработку с помощью новейших инструментов, я нашел и принял, что хочу использовать TAP, поскольку Джон Скит ответил OP на этот вопрос. Думаю, теперь я знаю, как обернуть мой код. Мой вопрос, однако, не в том, что использовать технологию, а не как использовать async/wait.

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

Я хочу использовать шаблон стратегии, чтобы в одном случае два конца были формами, а команды - результатом нажатия кнопок, параметрами текстовых полей. Эта форма существует. И вторая стратегия, еще не написанная, заключается в том, чтобы два конца связывались по сети между компьютерами. Сервер будет сервисом Windows, командный модуль - формой, которая будет отправлять команды в ответ на автоматизацию производственной линии.

Это не помогает мне сказать: «Использовать RPC» или «использовать сокет». Что такое RPC? И как код сокета относится к той части, которая отправляет команды ... как выглядит код?

Скажем, у меня есть:

public async void SendCommandAsync(Command c, Parameters p) 
    { 
     string response; 
     await response = SendAsync(c, p); 
    } 

Что требуется, чтобы быть на месте, прежде чем эта функция называется? И что такое SendAsync()? Как он связывается с удаленным слушателем? Какой параллелизм существует между двумя стратегиями, один из которых общается по сети, с SOAP или HTTP, другой из которых находится на одном компьютере, одна форма для другой?

Спасибо, что смирились с моим невежеством.

+0

Могут ли пособия по TCP, сериализации, SOAP, ... помочь вам? Если да, это не является хорошим вопросом для переполнения стека. Вам лучше всего послушать исчерпывающие учебные пособия. – usr

+0

Я не думаю, что они это сделают. В прошлом я написал такой код, но современные модели развития намного проще и пока незнакомы мне. Я думал, что это может быть справедливо и для кого-то другого, кто мог бы использовать простой пример. Учитывая основание, я могу идти оттуда. О тех вещах, которые вы упомянули, что бы вы использовали? (Я отредактирую свой вопрос для получения большей ясности ...) – shipr

+0

Не могли бы вы ответить на вопрос: «Как отправить запрос и получить ответ по сети другому процессу и/или машине?»? Вы ищете руководство по прагматическому достижению такого? – usr

ответ

0

HTTP-протокол, по-видимому, является тем, что вы ищете. Он выполняет единую пару запроса/ответа с удаленным хостом по TCP. Индивидуальные запросы и соответствующие ответы независимы. HTTP по существу дает вам функцию:

byte[] response = Request(string remoteUrl, byte[] request); 

Все, что находится внутри этой функции, автоматизировано библиотеками. То же самое касается сервера.

Если вы хотите общаться с использованием структурированных данных (деревьев объектов), вы, вероятно, должны использовать веб-службы (возможно, на основе SOAP). Они являются слоем поверх HTTP и позволяют отправлять и получать объекты вместо массивов байтов.

Что касается шаблона стратегии: вы можете поместить шаблон на место в разные слои.

  • Если вы готовы взять на себя TCP (который работает на локальном хосте шлейфом, а) вам нужно только изменить удаленную конечную точку IP и порт
  • Если вы не готовы взять на себя TCP, то можно предположить, что двунаправленный Stream есть, чтобы обмениваться сообщениями. HTTP может работать над любым потоком. В соединениях localhost вы можете использовать именованные каналы.В процессе вы можете использовать MemoryStream.
  • Или вы полностью отвлеките весь транспортный аспект, предположив, что существует функция вида object response = Request(object request);. Эта функция может поддерживаться посредством SOAP-over-HTTP или любым другим настраиваемым транспортом.
+0

Хорошо, пока это хорошее начало. Итак, вы говорите, что я должен делать: await byte [] response = Request (string url, byte [] command)? (Это не похоже на метод Async, но это?) – shipr

+0

Async или нет, похоже, не связаны с тем, чего вы хотите достичь. Будете ли вы писать новый WebClient(). DownloadString («http://example.org/») 'или' ждать нового WebClient(). DownloadStringTaskAsync («http://example.org/») 'зависит от того, что ваш проект структурирована как и какие технологии вы используете. Они выполняют точно то же самое: они загружают строку (этот код является полным и исполняемым, кстати, он выполняет HTTP-запрос). – usr