2011-11-19 162 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場景中爲您執行此綁定 –