2010-03-17 58 views
6

我在我們的項目中實施了一些網絡連接。已經決定溝通非常重要,我們希望同步進行溝通。所以客戶端發送服務器確認的內容。是否有一些通用的網絡編程最佳實踐?

是否有一些客戶端和服務器之間的交互的一般最佳做法。例如,如果客戶端自動重試,服務器沒有答案?重試前是否應該有超時時間?如果確認失敗會發生什麼?我們在什麼時候斷開連接並重新連接?有一些材料嗎?我已經完成了搜索,但是沒有什麼會真正出現。

我正在尋找一般的最佳實踐。我在c#中實現這個(可能與套接字),所以如果有.Net具體的東西,請讓我知道。

+1

http://stackoverflow.com/questions/2368580/socket-protocol-fundamentals可能是有趣的。 – 2010-04-09 16:15:44

回答

6

聯網的第一條規則 - 您正在發送消息,而不是調用函數。

如果你這樣接近網絡,不要假裝你可以遠程調用函數或者有「遠程對象」,那麼你會沒事的。你從來沒有在網絡連接的另一端有一個實際的「東西」 - 你擁有的基本上就是這個東西的圖片。

全部您從網絡獲取的是舊數據。你是從來沒有最新。因此,您需要確保您的消息具有正確的語義 - 例如,您可以通過值遞增或遞減某些內容,但不應將其值設置爲當前值加上或減去另一個值(因爲當前值可能在你的消息到達那裏時改變)。

2

如果客戶端和服務器都寫在.NET/C#我會建議WCF insted的原始套接字的,因爲它可以節省你從大量的管道代碼序列化和反序列化,消息等

同步

雖然這可能並沒有真正回答你關於最佳實踐的問題;-)

1

首先要做的是根據速度,丟失信息的概率,名義和高峯流量,瓶頸,客戶端來表徵您的特定網絡和服務器MTBF,...

然後只有你決定你需要什麼y我們的協議。在很多情況下,您不需要複雜的錯誤處理機制,並且可以可靠地使用普通的UDP實現服務。

在少數情況下,您將需要構建更強大的功能,以便在通過您不可信任的網絡連接的多臺計算機中保持一致的全局狀態。

1

我發現的最重要的事情是,消息總是應該是無狀態(REST的閱讀了,如果這意味着什麼給你)

例如,如果您的應用程序監控的出貨量在網絡上的數量不發送增量更新(+ x)​​,但總是新的總數。

+0

這非常有道理。好建議。幸運的是,我們的信息是無國籍的。這更多的是巧合而不是設計:) – uriDium 2010-03-17 08:52:50

+0

對你有好處!我最近不得不回顧性地改變一個應用程序,這個應用程序有各種各樣的切換信息,最終總是會感到困惑。 – 2010-03-17 09:11:30

+0

無狀態是一個很好的通用指南,但不總是*必須的。有些場景確實需要非無狀態消息 - 這取決於情況。然而,首先進行無狀態是一個偉大的啓發。而像「切換信息」這樣的東西本質上是不好的。另一方面,正如我在我的回答中指出的那樣,「增量」通常就是你想要的東西,因爲它總是會在服務器上做正確的事情(如果你認爲當前值爲「設置爲5」是4) – kyoryu 2010-03-17 17:24:17

0

在一個常見的網絡編程思想中,我認爲你應該瞭解:
1.套接字(當然)。
2.叉和線程。
3.鎖定過程(使用互斥鎖或信號量或其他)。

希望這個幫助..

+0

嗨,謝謝,但不是真的。所有這些都很好。我只是在尋找一些通用的指導方針。例如ACK等的使用。 – uriDium 2010-03-17 11:12:13

+0

不是學習線程,而是學習非阻塞IO(如果在套接層級別工作,那就是)。 – kyoryu 2010-03-17 17:24:59