2011-11-19 44 views
23

Busco sugerencias sobre la mejor manera de enviar/recibir datos de un dispositivo GPRS a distancia, a través del puerto 80.El envío de datos binarios a través de http

Creación de un socket TCP sin formato en un puerto aleatorio funciona bien, pero muchos los operadores solo permiten el tráfico HTTP del puerto 80 a través de sus proxies, y luego esperan datos ascii HTTP (para los cuales pueden modificar los encabezados según sea necesario.

Entonces, ¿debería mi dispositivo crear una solicitud POST en una conexión http persistente y luego recibir un respuesta codificada en base64 del servicio web? No estoy seguro de cómo se comportan los proxys móviles cuando se trata de datos binarios. ¿Hay alguna manera recomendada de hacerlo?

Puedo adaptar tanto el firmware del dispositivo como la aplicación del servidor.

[Editar]

me gustaría saber si hay una manera estándar (más o menos) para hacer esto. Para varios sistemas industriales y de registro de datos, existe la necesidad de enviar muchos datos binarios a través de conexiones de socket. En el caso de las conexiones de Ethernet, normalmente solo hay problemas relacionados con la adaptación de algunos firewalls, pero las conexiones binarias persistentes no tienen problemas para establecerse en puertos arbitrarios.

Los ISP móviles, sin embargo, tienden a limitar sus "planes de datos" solo para el puerto 80. También se toman la libertad de meterse con los encabezados HTTP, y potencialmente con los datos HTML en sí. Aquí es donde necesito identificar las posibles dificultades y las formas de eludirlas.

  • ¿Simplemente enviará base64 datos codificados?
  • ¿Cómo se manejan las sesiones HTTP? Los sockets arbitrarios se pueden mantener vivos durante mucho tiempo, pero los verbos HTTP generalmente son de corta duración. ¿Esto significa que tendré que crear una nueva conexión para cada paquete de datos? ¿O hay una forma de enviar las respuestas del servidor en fragmentos, a través de una sola conexión?
  • ¿De qué manera puede un proxy de ISP interferir con los datos o los encabezados? Por ejemplo, un proxy a veces puede mantener viva una conexión, incluso si el servidor la cierra.

Respuesta

33

¿Simplemente enviará base64 datos codificados?

No hay necesidad de utilizar la codificación de base 64 - esto simplemente aumentar el número de bytes que se debe transferir. Los operadores móviles normalmente limitan la manipulación de respuestas a tipos de contenido que entienden, es decir, imágenes, hojas de estilo, etc.

¿Cómo se manejan las sesiones HTTP?

Las sesiones HTTP se manejan normalmente a través de un parámetro de consulta URL o mediante un valor de cookie. Sin embargo, por lo que ha dicho, no parece que las sesiones sean necesarias.

Los sockets arbitrarios se pueden mantener vivos durante mucho tiempo, pero los verbos HTTP suelen durar poco. ¿Esto significa que tendré que crear una nueva conexión para cada paquete de datos?

Las solicitudes HTTP pueden durar un período arbitrariamente largo, al igual que para los sockets TCP sin formato. Una solicitud GET puede durar horas si es necesario.No necesita crear una nueva conexión para cada solicitud — eche un vistazo al encabezado HTTP Connection: Keep-Alive.

O hay una manera de enviar las respuestas del servidor en trozos, a través de una sola conexión?

Si no conoce la duración de la respuesta, puede omitir un encabezado Content-Length o, preferiblemente, utilizar el encabezado HTTP Transfer-Encoding: chunked.

¿De qué manera puede un proxy de ISP interferir con los datos o los encabezados? Por ejemplo, un proxy a veces puede mantener viva una conexión, incluso si el servidor la cierra.

Los ISP no suelen revelar los cambios que realizan en las respuestas HTTP. Si le preocupa esto, una solución simple sería cifrar los datos y especificar un encabezado HTTP Content-Encoding. Esto requeriría que controlas tanto el cliente HTTP como el servidor.

+0

+1 Gracias. Una pequeña aclaración: * Los operadores móviles normalmente limitan la manipulación de las respuestas a los tipos de contenido que entienden *: ¿eso significa que debo usar un tipo de contenido que ** no ** entiendan? – Groo

+1

Las transformaciones realizadas por los operadores móviles son típicamente para tipos de medios donde saben que se puede devolver una respuesta 'equivalente'. Los ejemplos serían la compresión de una imagen JPEG o la incorporación de CSS/Javascript en un archivo HTML. Si está enviando datos en un formato propietario, debería usar un tipo de medio como 'application/vnd.company-name.tipo de archivo': es poco probable que los intermediarios lo transformen, ya que no entienden el formato. – johnstok

+0

@johnstok El encabezado Content-Length especifica la longitud de cualquier dato en bytes. Por lo tanto, independientemente de si los datos cumplen con los estándares o si son propietarios, los operadores pueden reenviar esos muchos bytes. – ardsrk

14

Si es posible, puede simplemente enviar los datos como solicitudes y respuestas HTTP.

HTTP es perfectamente capaz de manejar datos binarios: las imágenes se envían a través de HTTP todo el tiempo, y son binarias. Las personas cargan y descargan archivos de tipos de datos arbitrarios todo el tiempo sin problema.

Solo tiene que darle un tipo mime de "application/octet-stream" - que es básicamente un tipo de mime genérico para datos binarios sin más especificaciones de qué tipo - y cualquier proxy en el camino debe dejarlo en paz .

-2

Recomendaría un servicio web SOAP. Acepta una solicitud POST que contiene parámetros XML. Hay una forma estándar de enviar datos binarios a través de SOAP/XML. Hacemos esto todo el tiempo para transportar byte [] sobre SOAP.

En su WSDL, declare su campo para ser de este tipo:

<xs:element name="myByteArrayFieldName" type="xs:base64Binary"/>

Somos una tienda de Java y utilizamos JAXB/CXF y generar el WSDL sobre la marcha de los objetos Java. JAXB maneja automágicamente la traducción de byte [] a xs: base64Binary, por lo que ni siquiera necesita saber que sus datos se codifican como base64.

Los servicios SOAP no tienen sesiones, por lo que no debe preocuparse por las sesiones http. Lo más probable es que cree una nueva conexión, pero solo me preocuparía si realmente hay un problema con ella. Debido a que esta es una solicitud POST sin cookie de sesión, dudo que el ISP se meta con ella. Siempre puedes usar HTTPS solo para estar seguro. En un enlace GPRS que tenderá a conectarse/desconectarse, no intentaría mantener un socket abierto.

+0

Debe tener en cuenta que el tipo "xs: base64Binary" no hace que la codificación base64 se realice en los datos (!!). Lo que hace es enviar la respuesta como Multipart-Related usando límites Mime para separar información de encabezado y texto de los datos binarios. –

+0

JAXB/CXF hará esto vinculante para usted en un escenario de Java First –

Cuestiones relacionadas