通过http发送二进制数据

时间:2011-11-19 18:09:56

标签: http proxy binary-data

我正在寻找有关通过端口80从远程GPRS设备发送/接收数据的最佳方式的建议。

在随机端口上创建普通TCP套接字工作正常,但许多运营商只允许端口80 HTTP流量通过其代理,然后期望HTTP ascii数据(他们可以根据需要修改标头。

那么,我的设备是否应该在持久的http连接上创建POST请求,然后从Web服务接收base64编码的响应?我不确定涉及二进制数据时移动代理的行为如何。有推荐的方法吗?

我可以调整设备的固件和服务器端应用程序。

[编辑]

我想知道是否有标准(或多或少)方式来执行此操作。对于各种数据记录和工业系统,需要通过套接字连接发送大量二进制数据。对于以太网连接,通常只有适应某些防火墙的问题,但持久的二进制连接在任意端口上建立都没有问题。

但是,移动互联网服务提供商倾向于仅限制端口80的“数据计划”。他们也可以随意使用HTTP标头,也可能是HTML数据本身。这是我需要识别潜在陷阱和规避它们的方法。

  • 只需发送base64编码数据吗?
  • 如何处理HTTP会话?任意套接字可以保持很长时间,但HTTP动词通常是短暂的。这是否意味着我需要为每个数据包创建一个新连接?或者有没有办法通过单个连接以块的形式发送服务器响应?
  • ISP代理以什么方式处理数据或标题?例如,代理有时可以使连接保持活动状态,即使服务器关闭它也是如此。

4 个答案:

答案 0 :(得分:35)

  

只需发送base64编码数据吗?

无需使用base 64编码 - 这只会增加必须传输的字节数。移动运营商通常会限制对他们理解的内容类型(即图像,样式表等)的响应错误。

  

如何处理HTTP会话?

HTTP会话通常通过URL查询参数或cookie值处理。但是,根据你的说法,这听起来并不像是必要的会议。

  

任意套接字可以保持很长时间,但HTTP动词通常是短暂的。这是否意味着我需要为每个数据包创建一个新连接?

HTTP请求可以持续任意长时间,就像原始TCP套接字一样。如有必要,GET请求可持续数小时。您无需为每个请求创建新连接 - 请查看Connection: Keep-Alive HTTP标头。

  

或者有没有办法通过单个连接以块的形式发送服务器响应?

如果您不知道响应的长度,可以省略Content-Length标头,或者最好使用Transfer-Encoding: chunked HTTP标头。

  

ISP代理以什么方式处理数据或标题?例如,代理有时可以使连接保持活动状态,即使服务器关闭它也是如此。

ISP不倾向于透露他们对HTTP响应所做的更改。如果您担心这一点,一个简单的解决方案是加密数据并指定Content-Encoding HTTP标头。这将要求您控制HTTP客户端和服务器。

答案 1 :(得分:19)

如果可能,您可以将数据作为HTTP请求和响应发送。

HTTP完全能够处理二进制数据:图像一直通过HTTP发送,而且它们是二进制的。人们一直上传和下载任意数据类型的文件都没有问题。

只需给它一个mime类型的“application / octet-stream” - 这基本上是二进制数据的通用mime类型,没有进一步说明什么类型 - 并且沿途的任何代理应该不管它。

答案 2 :(得分:1)

ASP.NET C#实现将像图像作为POST请求的二进制数据上传到目标URL:。

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

答案 3 :(得分:-4)

我建议使用SOAP Web服务。它接受包含XML参数的POST请求。有一种通过SOAP / XML发送二进制数据的标准方法。我们一直这样做,通过SOAP传输byte []。

在您的WSDL中,声明您的字段属于此类型:

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

我们是一家Java商店,我们使用JAXB / CXF并从Java Objects动态生成WSDL。 JAXB自动处理从byte []到xs:base64Binary的转换,因此您甚至不需要知道您的数据被编码为base64!

SOAP服务没有会话,因此您无需担心http会话。它很可能会创建一个新的连接,但我只担心它确实存在问题。因为这是一个没有会话cookie的POST请求,我怀疑ISP会不会搞乱它。您总是可以使用HTTPS来确定。在易于连接/断开的GPRS链路上,我不会尝试保持套接字打开。

相关问题