Как протолкнуть данные через интернет? - PullRequest
2 голосов
/ 29 ноября 2009

Я хочу отправить данные в клиентское приложение. Клиентское приложение может быть толстым или тонким. Толчок должен произойти через Интернет. Как это можно сделать?

EDIT: Есть ли способ, при котором клиентское приложение открывает соединение с сервером, поддерживает его в течение всего срока его жизни, а затем продолжает получать данные по этому соединению. Могу ли я построить что-то подобное? Любая помощь приветствуется.

Обновления: Мой толстый клиент будет в Wpf, а мой тонкий клиент будет приложением silverlight. Я хочу иметь минимальную задержку. Также для определенных категорий данных частота обновлений будет более 10 в секунду. Я в порядке, строю такое решение, если чего-то готового не существует. Я просто хочу несколько указателей / идей, чтобы начать.

Ответы [ 7 ]

2 голосов
/ 29 ноября 2009

Если ваш клиент открывает сокет для сервера, он может оставаться открытым неограниченное время. Просто убедитесь, что время от времени отправляете несколько пакетов поддержки активности. В противном случае «умные» маршрутизаторы могут разорвать ваше соединение.

Так ДА, это можно сделать!

2 голосов
/ 29 ноября 2009

Сначала нужно задать себе несколько вопросов:

  • Является ли мой «клиент» веб-браузером или исполняемым файлом?
  • Сколько клиентов будет подключаться к моему серверу?
  • Как часто клиентам будут отправляться данные?
  • Насколько важно, чтобы клиенты получали данные немедленно (в отличие от второй или двух задержек)?

Если вашим клиентом является веб-браузер, то ваши возможности более ограничены, обратитесь к Comet за некоторыми рекомендациями. Как кто-то еще упомянул, вот хорошее сообщение в блоге, объясняющее, как сделать Comet с ASP.NET .

Если вы не ожидаете много клиентов, то открытие соединений от клиента к серверу может быть жизнеспособным решением, посмотрите на эти страницы MSDN информацию и базовый пример: - TcpListener - TcpClient

Если вы ожидаете много клиентов (более 50 в зависимости от вашего серверного оборудования), то ваши варианты зависят от ответов на другие вопросы:

Если ваши клиенты получают данные часто и короткие (секунды) задержки являются приемлемыми, тогда опрос - это простое решение, вы можете скрыть реализацию от клиента, чтобы казалось, что данные выталкиваются, но на самом деле в потоке есть поток клиент, который опрашивает каждые несколько секунд.

Если ваши клиенты не получают данные очень часто, то что-то вроде Comet может быть хорошим вариантом, выполните поиск по запросу "Long Polling WCF", если вы ищете решение .NET.

Обновление: Поскольку вы уже заявили, что вашим клиентом является Silverlight, я настоятельно рекомендую эти сообщения в блоге, в которых говорится о том, что вы ищете:

Дуплексная служба WCF более хороша тем, что использует заданные сообщения и ответы, поэтому нет необходимости самостоятельно анализировать текстовые или двоичные данные. Это в основном версия Comet для Silverlight.

0 голосов
/ 29 ноября 2009

Лучшее решение - использовать опрос, как предлагает Краген, он гарантирует, что ваш сервер не будет перегружен простоями, которые существуют только для отправки данных в редких случаях. Опрос предоставляет вам те же функциональные возможности, однако у вас нет такой постоянной нагрузки на ваш сервер, что в дополнение к необходимости одного потока для каждого клиента (при условии, что ваш сервер создает поток для каждого клиента, такого как apache и т. Д.). С тонким клиентом (работающим в браузере) вы можете сделать это с помощью AJAX, чтобы предотвратить постоянную перезагрузку страницы. Если в толстом клиенте вы можете сделать то же самое, но использовать фоновое событие для отправки запросов.

Если вам все еще нужно отправить данные клиенту с сервера в сценарии Fat Client, лучшее решение состоит в том, чтобы клиент открыл сокет прослушивания, когда запрос от сервера должен быть передан клиенту, серверу. подключается к клиенту и отправляет запрос (после аутентификации сервер записывает, что IP-адрес пользователя инициирует подключение). В сценарии с тонким клиентом (через веб-браузер) это чрезвычайно сложно сделать, если не невозможно (при использовании надлежащих политик безопасности).

Мы предложили бы более подробное объяснение того, почему вы пытаетесь это сделать, что позволило бы нам предложить вам более «целевое» решение, соответствующее вашим потребностям.

0 голосов
/ 29 ноября 2009

Мне нужно было сделать это ранее в этом году, но я не могу найти код на этом компьютере. Помогает ли это SO link ?

ОБНОВЛЕНИЕ: я нашел статью , которую я использовал, когда мне нужно было это получить. Предупреждение, что использует 3,5, и я думаю, WCF. Код скопирован из статьи Кейвана Найери здесь:

        OperationContext context = OperationContext.Current;
        MessageProperties messageProperties = context.IncomingMessageProperties;
        RemoteEndpointMessageProperty endpointProperty =
            messageProperties[RemoteEndpointMessageProperty.Name]
            as RemoteEndpointMessageProperty;

        return string.Format("Hello {0}! Your IP address is {1} and your port is {2}",
            value, endpointProperty.Address, endpointProperty.Port);
0 голосов
/ 29 ноября 2009

Я предлагаю вам использовать Комета . Проверьте следующие артикул и пример .

0 голосов
/ 29 ноября 2009

Краткий ответ - использовать опрос.

Этот вопрос очень похож:

http-сервер asp.net отправляет клиенту

0 голосов
/ 29 ноября 2009

Есть много способов - лучший способ - заставить клиента проверять сервер на наличие обновлений и заставлять его пересылать данные (используя стандартный протокол FTP - для файлов или других протоколов связи для чего-либо еще - например, WCF, Web Услуги и т. Д.) Таким образом, вам не нужно беспокоиться о брандмауэрах и натсах.

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

...