Отправка двоичных данных через http - PullRequest
27 голосов
/ 19 ноября 2011

Я ищу предложения о наилучшем способе отправки / получения данных с удаленного устройства GPRS через порт 80.

Создание простого сокета TCP на случайном порту работает нормально, но многие операторы пропускают HTTP-трафик порта 80 только через свои прокси-серверы, а затем ожидают данные HTTP ascii (для которых они могут изменять заголовки по мере необходимости.

Итак, должно ли мое устройство создать запрос POST для постоянного http-соединения, а затем получить ответ в кодировке base64 от веб-службы? Я не уверен, как ведут себя мобильные прокси, когда задействованы двоичные данные. Есть ли рекомендуемый способ сделать это?

Я могу адаптировать как прошивку устройства, так и приложение на стороне сервера.

[Изменить]

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

Мобильные интернет-провайдеры, как правило, ограничивают свои «планы передачи данных» только для порта 80. Они также могут свободно связываться с заголовками HTTP и, возможно, с самими данными HTML. Здесь я должен определить потенциальные ловушки и способы их обойти.

  • Будет ли работать просто отправка данных в кодировке base64?
  • Как обрабатываются сеансы HTTP? Произвольные сокеты можно поддерживать в течение длительного времени, но HTTP-глаголы обычно недолговечны. Означает ли это, что мне нужно будет создать новое соединение для каждого пакета данных? Или есть способ отправить ответы сервера по частям по одному соединению?
  • Каким образом прокси-провайдер может связываться с данными или заголовками? Например, прокси-сервер может иногда поддерживать соединение, даже если сервер его закрывает.

Ответы [ 3 ]

36 голосов
/ 10 декабря 2011

Будет ли работать просто отправка данных в кодировке base64?

Нет необходимости использовать кодировку base 64 - это просто увеличит количество байтов, которые вы должны передать. Мобильные операторы обычно ограничивают искажение ответов на типы контента, которые они понимают, т.е. изображения, таблицы стилей и т. Д.

Как обрабатываются сеансы HTTP?

Сеансы HTTP обычно обрабатываются либо через параметр запроса URL, либо через значение cookie. Однако из того, что вы сказали, не похоже, что сеансы необходимы.

Произвольные сокеты можно поддерживать в течение долгого времени, но HTTP-глаголы обычно недолговечны. Означает ли это, что мне нужно будет создать новое соединение для каждого пакета данных?

HTTP-запросы могут длиться сколь угодно долго, так же как и для необработанных TCP-сокетов. Запрос GET может длиться часами, если это необходимо. Вам не нужно создавать новое соединение для каждого запроса & mdash; взгляните на HTTP-заголовок Connection: Keep-Alive.

Или есть способ отправить серверные ответы по частям по одному соединению?

Если вы не знаете длину ответа, вы можете либо опустить заголовок Content-Length, либо, предпочтительно, использовать заголовок Transfer-Encoding: chunked HTTP.

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

Интернет-провайдеры не склонны сообщать об изменениях, которые они вносят в ответы HTTP. Если вы обеспокоены этим, то простым решением было бы зашифровать данные и указать заголовок HTTP Content-Encoding. Это потребует от вас управления как клиентом, так и сервером HTTP.

19 голосов
/ 14 декабря 2011

Если возможно, вы можете просто отправлять данные в виде HTTP-запросов и ответов.

HTTP вполне способен обрабатывать двоичные данные: изображения отправляются по HTTP все время, и они двоичные.Люди загружают и скачивают файлы произвольных типов данных все время без проблем.

Просто дайте ему mime-тип «application / octet-stream» - который в основном является общим типом mime для двоичных данных бездальнейшее уточнение того, какого рода - и любые прокси по пути должны оставить это в покое.

1 голос
/ 18 августа 2013

ASP.NET C # реализация загрузки двоичных данных, таких как изображения, как POST-запрос на целевой URL:.

http://technowide.net/2012/09/01/upload-binary-data-http-post/

...