2011-08-31 129 views
0

我的應用程序充當銀行服務器的客戶端,發送請求並從該服務器獲取響應。在數據庫中完成響應處理需要一些時間,所以如果服務器在0.5秒內發送響應並且數據庫操作需要1秒,之後只有我的應用程序再次嘗試通過開始接收來從服務器接收數據,那麼數據應該在某處積累,如果是的,它將被存儲在哪裏。是否會有一些限制,使數據溢出,並且是否會關閉此套接字。我宣佈我的套接字緩衝區大小爲1024.如果有人也有一些文章清楚我的疑惑,請分享。TCP套接字緩衝區和數據溢出

+0

爲什麼你不測試它? – Carsten

+0

我已經測試過,發現即使應用程序運行速度很慢,但如果我的緩衝區大小隻有1024位,我想要將這些數據存儲在哪裏 – funsukvangdu

+0

要麼放大緩衝區大小,要麼將其存儲在自己的緩衝區中,或者甚至更好地找出原因你對數據庫的更新需要很長時間 – Carsten

回答

1

你能控制服務器發送給你的東西嗎?在大多數情況下,當接收機對接收到的數據進行操作時,完成工作後發送應用級ACK將允許發送方知道何時發送下一個請求。這將確保沒有數據丟失(因爲TCP將確保它不會在網絡中丟失)。

如果您無法更改服務器向您發送數據的方式,則可以考慮在不同的線程中運行接收器,以便將每個傳入請求保存到緩存中(只在RAM中或HD中)。然後,一個工作者線程(或多個線程)將讀取來自該緩存的請求並完成您需要的工作。這樣你就可以完全控制數據的緩衝。

+0

我同意你的看法,但我唯一的疑問是如果我沒有任何控制權服務器和它的發送速度遠遠大於客戶端接收速度(這可能不會發生,但只是我需要澄清)所以會發生什麼。數據是否會在tcp中溢出並丟失,如果丟失,是否會關閉套接字或者它會一直保留在那裏,直到客戶端讀取所有數據。 – funsukvangdu

+0

OS套接字層有一個內部緩衝區。它的大小可以通過'ReceiveBufferSize'屬性來控制。如果此緩衝區已滿,它將覆蓋舊數據或刪除新數據。如果套接字被數據仍在緩衝區中關閉,您仍然可以讀取數據(因爲TCP套接字關閉僅用於發送)。 –

0

我想你會用Socket自己讀取數據塊 - 不是嗎?不僅僅是閱讀的內容比你能處理的要多。發件人應該這樣做 - 如果您的輸入緩衝區溢出,發件人應該在發送更多內容之前等待。但是在這種情況下可能會出現錯誤。如果這真的是一個大問題,那麼首先將數據下載到磁盤上的文件中,並在完成所有操作後處理數據。我不認爲你的硬盤會比你的網絡慢:)

+0

我同意你,但我唯一的疑問是,如果我沒有任何控制服務器和它的發送速度遠遠大於客戶接收速度(可能不會發生,但只是我需要澄清),那麼會發生什麼。數據是否會在tcp中溢出並丟失,如果丟失,是否會關閉套接字或者它會一直保留在那裏,直到客戶端讀取所有數據。 – funsukvangdu

+0

這將取決於您的客戶端和服務器 - 如果服務器在發送軟件包後沒有檢查/等待,這些位可能會在*空間中的某處丟失* - 但不要擔心:如果先保存到硬盤,然後在您身邊不會有什麼大問題 - 你的速度就夠了,所有其他討厭的細節都由網絡基礎設施來處理;) – Carsten