【问题标题】:Sending binary data over http通过 http 发送二进制数据
【发布时间】:2012-01-02 00:37:20
【问题描述】:

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

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

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

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

[编辑]

我想知道是否有一种标准(或多或少)方法可以做到这一点。对于各种数据记录和工业系统,需要通过套接字连接发送大量二进制数据。对于以太网连接,通常只涉及调整某些防火墙的问题,但持久的二进制连接在任意端口上建立起来没有问题。

然而,移动 ISP 倾向于将其“数据计划”仅限于端口 80。他们还冒昧地弄乱了 HTTP 标头,可能还有 HTML 数据本身。这就是我需要找出潜在的陷阱和规避它们的方法的地方。

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

【问题讨论】:

    标签: http proxy binary-data


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      HTTP 完全能够处理二进制数据:图像始终通过 HTTP 发送,并且它们是二进制的。人们一直在毫无问题地上传和下载任意数据类型的文件。

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

      【讨论】:

        【解决方案3】:

        简单地发送 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 谢谢。一个小小的澄清:移动运营商通常会限制对他们理解的内容类型的响应进行修改 - 这是否意味着我应该使用他们理解的内容类型?跨度>
        • 移动运营商所做的转换通常适用于他们知道可以返回“等效”响应的媒体类型。例如压缩 JPEG 图像或将 CSS/Javascript 内联到 HTML 文件中。如果您以专有格式发送数据,您将使用application/vnd.company-name.file-type 之类的媒体类型 - 这不太可能被中间人转换,因为他们不理解格式。
        • @johnstok Content-Length 标头指定任何数据的长度(以字节为单位)。因此,无论数据是符合标准还是专有的,运营商都可以转发那么多字节。
        猜你喜欢
        • 2013-11-26
        • 2011-12-13
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多