我必須實現一個應用程序,它在很短的時間內每隔幾秒向服務器發送一次數據包,當服務器收到它時,它會向客戶端發送一個響應,然後纔會發送另一個數據包。這聽起來很不錯,但是我們使用的是TCP,服務器收到數據包後就立即響應,而不是後處理或類似的東西。所以這讓我想知道,你爲什麼要這樣做?客戶端有一個隊列,我不停的所有數據包,並做了這樣的事情:驗證是否需要TCP?
try {
send packet // exception is thrown if connection is lost
remove packet from queue
} catch exception {
try to reconnect
}
所以在這種情況下,數據包被從隊列中刪除僅當發送成功。
對此有何想法?這是最佳做法嗎?如果有人能爲我解決這個問題,我將不勝感激。
謝謝
問:你的問題是什麼? 「開火併忘記」(而不是保持隊列)會更好嗎?答:很可能。使用UDP而不是TCP會更好嗎(只要我們保持隊列並可能管理重試)?答:很可能。檢測「發送」錯誤(沒有某種「ACK」)會有問題嗎?答:是的。任何這些(潛在)問題的答案是:「這取決於」。 ;)恕我直言... – paulsm4 2012-07-30 18:48:48
TCP保證運輸和訂購。所以對於UDP你可能會失去排序,你將不得不自己重新發送和重新排序和分片。 – 2012-07-30 18:50:40
如果您只需要知道連接已啓動,就會出現一個名爲TCP_KEEPALIVE的選項,它會發送數據包以保持連接處於活動狀態,如果它們丟失,則會將其保留。這自然不會保證軟件在另一端正在工作,只是TCP連接還活着。 – 2012-07-30 18:52:33