我正在寻找有关通过端口80从远程GPRS设备发送/接收数据的最佳方式的建议。
在随机端口上创建普通TCP套接字工作正常,但许多运营商只允许端口80 HTTP流量通过其代理,然后期望HTTP ascii数据(他们可以根据需要修改标头。
那么,我的设备是否应该在持久的http连接上创建POST请求,然后从Web服务接收base64编码的响应?我不确定涉及二进制数据时移动代理的行为如何。有推荐的方法吗?
我可以调整设备的固件和服务器端应用程序。
[编辑]
我想知道是否有标准(或多或少)方式来执行此操作。对于各种数据记录和工业系统,需要通过套接字连接发送大量二进制数据。对于以太网连接,通常只有适应某些防火墙的问题,但持久的二进制连接在任意端口上建立都没有问题。
但是,移动互联网服务提供商倾向于仅限制端口80的“数据计划”。他们也可以随意使用HTTP标头,也可能是HTML数据本身。这是我需要识别潜在陷阱和规避它们的方法。答案 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链路上,我不会尝试保持套接字打开。