2012-11-26 48 views
1

不同的客戶端,我需要創建一個應用程序:服務器與Qt的

  • 擁有一臺服務器

  • 與連接到服務器併發送8個多頭(數據來自8個傳感器客戶端:雨,空氣溼度,風速...)1個的傳感器數據/長(傳感器數據從自定義USB裝置獲取)

  • 用戶的客戶端。最終用戶運行這種類型的客戶端連接到服務器以從傳感器中檢索數據。

我以前用過Qt,只用一種類型的客戶端創建客戶端 - 服務器應用程序。我也設法創建了這個應用程序,只是規模較小(使用5個字,客戶端同時連接到服務器)。我使用了Qt網絡示例fortune線程服務器和http://goo.gl/srypT並阻止算命客戶端的例子。

如何才能辨別哪些客戶是哪個? (因爲他們每次連接到互聯網時都有不同的IP地址)。在我的小規模應用程序中,我創建了某種協議,但必須有一種更有效的方法來執行此操作。

回答

1

我假設你想識別客戶端類型(「傳感器客戶端」與「用戶客戶端」),而不是單個客戶端實例。

直截了當的方式做,這是實現一個協議,在問題中提到。爲了您的使用情況下,這可能是很簡單的:

  • 讓「傳感器客戶端」發送「寫」命令,隨後您的傳感器數據(如「W」就足夠了一個字符)。然後服務器接收到「w」命令並知道他需要從客戶端讀取傳感器數據。
  • 讓「用戶客戶端」發送「讀取」命令(例如字符「r」)。當服務器收到「r」命令時,它知道它需要向客戶端發送數據。

如果出於某種原因,你不想要實現連這樣一個簡單的協議,你也可以設置它在聽不同的端口兩個獨立QTcpServer既可情況下,可以說,8192和8193.你的「傳感器的客戶端」然後將連接到端口8192,服務器通過端口號知道客戶端將發送數據。您的「用戶客戶端」將連接到端口8193,並且服務器知道客戶端期望數據並將發送所需的數據。

在任何情況下,你應該知道,沒有任何身份驗證和授權參與,誰知道簡單的協議和/或端口號可以發送和接收數據的任何客戶端。

+0

我已經用兩個獨立的QTcpServer實例實現瞭解決方案,它的工作非常好。現在我需要進行某種認證......但這是另一個問題。感謝您的好評,它確實幫助了我。 – Adrian

0

要識別客戶端,你必須使用某種類型的客戶端ID的。通常,使用某種散列(MD5摘要,UUID或GUID)作爲客戶端ID。當客戶端連接到服務器時,客戶端ID必須從客戶端發送到服務器。

在客戶端已被識別和接受後會發生什麼,取決於連接(協議)的類型。如果您使用有狀態協議,只要客戶端使用它,相同的連接就會保持打開狀態,因此無需重新識別客戶端。如果您使用無狀態連接(例如HTTP),則每當客戶端需要數據(即:文檔,頁面等)時,您將不得不重新從客戶端向服務器發送相同的ID服務器。

處理這種客戶機/服務器體系結構的一種更簡單和更有效的方法就是使用現有的,經過驗證的某種服務器。例如,假設您已經在使用C++,您可以使用Wt(http://www.webtoolkit.eu/wt/blog)等REST風格的Web服務器。

更妙的是,我會用一個Ruby-或類似一個基於Python的RESTful Web服務架構:

http://www.sinatrarb.com/

http://bottlepy.org/docs/dev/

http://flask.pocoo.org/

還是新的Ruby-ON- Rails API:

http://blog.steveklabnik.com/posts/2012-11-22-introducing-the-rails-api-project

https://github.com/rails-api/rails-api

用Ruby或Python開發服務器更快更簡單。客戶端可以用任何方式開發(使用Qt的C++,使用網頁瀏覽器的Javascript和許多其他方法)