2016-04-05 125 views
0

我有一臺服務器,我的客戶端向其發送帶有一些值的HTTP GET請求。服務器的最後只是將這些值存儲到數據庫中。關於丟失HTTP請求

現在,我注意到有時候我並沒有在數據庫中觀察這些值。下列情況之一可能發生:

  1. 不會發送它
  2. 服務器從未收到它
  3. 服務器無法以書面形式向數據庫

我最大的疑問,客戶端是,原因是2 - 但我無法完全解釋它。由於這是一個HTTP請求(意味着下面有TCP),應該保證GET請求的可靠傳送,對吧?即使我向服務器發送了一個GET請求 - 它從來沒有被服務器接收過嗎?如果是,那麼TCP在那裏做什麼?

或者,我可以自信地斷言,如果服務器啓動並運行,並且發送到服務器的所有內容都寫入數據庫,那麼數據庫中沒有GET請求的詳細信息意味着客戶端永遠不會發送它?

不確定詳細信息是否有幫助 - 但我正在運行一個tomcat服務器,我只是通過get請求發送一個名稱 - 值對。

+1

無論您使用哪種語言來發出http請求,您都必須檢查該操作的結果,並將其打印或記錄下來...... – MarcoS

+0

因此,例如,一些網絡問題和數據包從未到達服務器(因此我不會得到服務器的任何響應) - 至少這種情況應該由TCP處理 - 即 - 重新發送數據包 - 直到我們得到響應爲止? – TheBlueNotebook

+0

是的,最糟糕的是,你會收到一個超時錯誤... – MarcoS

回答

1

有幾件事情你似乎缺少。首先,是的,如果TCP成功完成,你幾乎可以保證你的消息(即TCP有效載荷)已經到達另一端:TCP確保它將處理丟失的包和包到達的順序。然而,這並不是普遍的失敗,因爲仍然存在超越TCP能力的東西(通過切斷以太網電纜想到物理斷開)。關於上述協議的句法正確性也沒有斷言。除了提供完美副本之外,任何檢查都不是TCP關心的問題。

因此,您的客戶端發出的請求有可能是錯誤的,或者確實是正確的,但您的服務器沒有正確解析。因爲Tomcat是一款非常成熟的軟件,所以前者更像後者一樣引人注目。我認爲,如果你能記錄和分析你的一些生成的流量,這將大有幫助。 Wireshark

你沒有真正提到你使用的數據庫。但有一些犧牲兼容有利於提高寫入速度。這些數據庫的性質使得它永遠不能確定實際寫入磁盤的內容,或者仍然駐留在內存中的某個緩衝區中。如果你碰巧使用這樣一個分貝,這是另一種調查。

編程,我建議你採取以下步驟與HTTP流量打交道時:

  • 已寫入套接字完成且沒有錯誤?
  • 是否可以從套接字讀取響應?
  • 響應是否攜帶2xx範圍內的代碼(表示操作成功)?

如果這些失敗,你應該真的記錄一些東西。

在相關說明中,您正在做的事情並不是要求GET方法,而是要求在更改應用程序狀態時使用POST。考慮它是一件好事;)

+0

不幸的是,我目前正在使用其他人寫的基礎設施,所以我不確定是否可以自由地改變基本的東西將GET調用更改爲POST調用。不過,我很好奇你爲什麼要將GET修改爲一個很好的POST。純粹是因爲約定的原因(使用的東西是他們打算使用的)還是在功能上也有一些直接的優勢? – TheBlueNotebook

+0

@TheBlueNotebook「POST」更接近HTTP規範,因爲「GET」僅用於信息檢索,而不是用於更改應用程序狀態。在某些情況下,GET允許這樣做,但這些不適用於您的用例恕我直言。並沒有直接的優勢。實際上,'POST'需要更多的努力來建立。面對目前遇到的問題,我認爲這很好。 – DaSourcerer

0

不知道具體情況,可以將其分解爲兩部分。 HTTP請求和數據庫寫入。當GET請求被確認時,客戶端將收到來自服務器的200 OK響應。我已經在Tomcat下編寫代碼來使用DAO連接到MySQL數據庫。在發生故障的情況下,將拋出並記錄異常。你正在使用哪種方法,你會想知道如何記錄失敗。