2013-04-28 57 views
2

我的程序:C#尋找雙向溝通。 (WCF)

  1. 不同的客戶端連接到服務器(用戶登錄)

  2. 然後服務器開始小數據(以下1KB)向他們每一秒(或更少)。

我的問題:

  1. 我應該使用什麼樣的服務? WCF是正確的嗎?
  2. 如果WCF,那麼使用哪個協議? http,tcp ...?

起初我以爲WCF是去與正確的事情。我實現了一個基本的簡單。然後突然我發現這只是一個客戶端到服務器的連接。而服務器無法以相同的方式與客戶端進行通信。除非我在客戶端啓動服務,並使其成爲服務器。

所以最後,我問我應該怎麼這個教學貫徹2路服務器和客戶機之間的通信,考慮到速度的因素,我提到和使用權協議。

UPDATE

好讓我補充了一些細節。這實際上是一個老師客戶端<>服務器<>學生客戶端通訊程序。教師在WPF的inkCanvas上繪製一些東西。這張圖應該推給所有學生的客戶。這就是爲什麼這個數據應該被服務器推送的原因。並且溝通必須是2路。

+0

你想要的客戶是什麼? Silverlight的? WPF? ASP.NET/AJAX? WinRT的? – 2013-04-28 15:24:34

+0

@ChrisSinclair它是WPF。實際上服務器應該實時發送InkCanvas更改到客戶端。 – xperator 2013-04-28 15:31:48

+2

看看http://msdn.microsoft.com/en-us/library/ms731064.aspx – khlr 2013-04-28 15:35:32

回答

1

一種可能性是看使用network library。看看使用NetworkComms.Net創建WPF聊天應用程序的this文章。客戶端 - >服務器,服務器 - >客戶端關係是對稱的,而不是WCF,因此推送通知是非常簡單的。您還有許多通信協議,例如TCP或UDP,並且可以輕鬆添加自己的擴展來處理傳出/傳入數據。

免責聲明 - 我對這個庫的開發人員。

+0

哇謝謝!庫代碼示例看起來非常簡單。幾分鐘後就會開始工作。但是,您能否告訴我爲什麼您建議通過WCF使用此代碼 – xperator 2013-04-28 16:40:23

+0

這絕對是一個偏好和編碼背景的問題,您可以同時使用這兩種方法。恕我直言(我接受我可能有點偏見)NetworkComms.Net比WCF更強大,當然更容易實施。 – MarcF 2013-04-28 16:45:23

0

,你已經開不最好有服務器推送數據給它的客戶,而是有客戶端從服務器獲取數據。雖然這對於雙面打印來說是可能的,但是由於安全原因,它不像多數ISP或服務器環境那樣被高度推薦,並且不允許來自其防火牆內的出站消息。

這裏是我的建議:

有客戶端應用程序(一個或多個)從服務器偶爾拉,而不是讓服務器推到它的客戶。通過這種方式,服務器不必具有恆定的連接,因爲它不會擴展,並且更重要的通信連接是來自一個應用程序(即服務器)的非常昂貴的資源。

重新設計您的方法。

+0

好吧,我添加了更新到我的文章。這就是爲什麼我需要服務器來推送數據的原因。 – xperator 2013-04-28 16:36:55

+0

我認爲@xperator是對的。在你的情況下,學生客戶端應該以循環方式從服務器刷新數據,以檢查教師客戶端的數據。那麼你必須提供這兩種客戶端。 – Bronek 2013-04-28 17:03:08

+0

感謝您的更新。從可擴展性的角度來看,我的方法仍然是一個更好的解決方案。這就是例如消息總線如何通過pub/sub模型工作。看起來子接收通知,但實際上客戶拉取數據。爲了幫助您可視化這一點,請將服務器視爲隊列。教師在隊列上發送消息(推送)。客戶端有一個後臺線程來定期檢查隊列(拉)。看看RabbitMQ。這將適合您使用稱爲主題的概念的需求。 – code5 2013-04-29 02:53:39

1

我實現了完全一樣的兩個功能WPF應用程序之間的通信。回答你的問題,是的,在我看來,WCF是最好的選擇。我想你已經實現了使用WCF的單向通信。爲了能夠讓服務器與客戶進行對話,您需要實現回調,here是一篇很好的文章。

0

我已經使用net.tcp編寫了一個託管在Windows Service上的WCF服務器,它絕對可以將數據推送到多個客戶端。該框架爲您提供了傾聽,接受和多重聯繫,所以肯定有很多好處。

您場景中棘手的部分將與教學客戶端共享數據。 AFAIK,沒有內置的方式將數據從一個客戶端服務器連接傳輸到另一個。

一個天真但簡單的方法是將教師數據存儲到一個臨時位置(如文件或數據庫,並具有某種互斥鎖),並且當需要將數據傳輸給學生時,只需從臨時位置。

或者您可以將您的架構更改爲Peer-To-Peer