2011-11-19 53 views
23

我正在寻找的最佳方式的建议发送二进制数据发送从远程GPRS设备/接收数据,通过端口80通过HTTP

创建一个随机端口工作正常上一个普通的TCP套接字,但许多运营商只允许端口80 HTTP流量通过他们的代理,然后期望HTTP ASCII数据(为此它们可以根据需要修改头文件)

因此,我的设备是否应该在持久http连接上创建POST请求,然后接收base64编码的响应来自Web服务?我不确定移动代理在涉及二进制数据时的行为方式。是否有推荐的方法来执行此操作?

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

[编辑]

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

然而,移动互联网服务提供商往往只限制其80端口的“数据计划”。他们也冒昧弄砸了HTTP标头,并且可能还有HTML数据本身。这是我需要找出潜在的陷阱和方法来规避它们。

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

回答

33

将简单地发送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客户端和服务器。

+0

+1谢谢。一个小小的说明:*移动运营商通常会限制对他们理解的内容类型的响应的篡改* - 这是否意味着我应该使用他们无法理解的内容类型? – Groo

+1

移动运营商所做的转换通常针对媒体类型,他们知道可以返回“等效”响应。例如压缩JPEG图像或将CSS/Javascript内联到HTML文件中。如果您使用专有格式发送数据,则可以使用类似“application/vnd.company-name”的媒体类型。文件类型“ - 这不太可能由中介转变,因为他们不理解格式。 – johnstok

+0

@johnstok Content-Length标头指定以字节为单位的任何数据的长度。因此,无论数据是符合标准还是专有,运营商都可以转发这些字节。 – ardsrk

14

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

HTTP完全有能力处理二进制数据:图像始终通过HTTP发送,并且它们是二进制的。人们无时无刻都在上传和下载任意数据类型的文件。

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

-2

我推荐一个SOAP web服务。它接受包含XML参数的POST请求。有一种通过SOAP/XML发送二进制数据的标准方式。我们一直在通过SOAP传输byte []。

在你的WSDL,声明你的领域是这种类型的:

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

我们是一个Java店,我们使用JAXB/CXF和生成从Java对象飞的WSDL。 JAXB自动处理从byte []到xs:base64Binary的转换,所以你甚至不需要知道你的数据被编码为base64!

SOAP服务没有会话,所以你不需要担心HTTP会话。它很可能会创建一个新的连接,但如果实际上存在问题,我只会担心。因为这是一个没有会话cookie的POST请求,我怀疑ISP会搞砸它。您可以随时使用HTTPS来确保。在一个倾向于连接/断开连接的GPRS链路上,我不会尝试保持一个套接字打开。

+0

您应该知道,“xs:base64Binary”类型实际上并不会导致数据(!!)上的base64编码。它所做的就是将响应作为Multipart-Related使用MIME边界发送,以便将二进制数据中的标题和文本信息分开。 –

+0

JAXB/CXF将在Java First场景中为您执行此绑定 –