2012-02-05 98 views
1

我正在開發一個分佈式應用程序,我需要將基於客戶端的Java連接到基於服務器C++的服務器上。他們都需要互相發送信息,但我需要他們能夠在等待信息的同時做些事情,他們不知道他們何時會獲得新信息或發送信息。如何實現良好的客戶端 - 服務器方法?

我該如何做到這一點?現在我正在嘗試與套接字進行基本的通信,但我實際上並沒有進行溝通。我讀過使用套接字+線程通常是客戶端 - 服務器應用程序的好方法。

您能否推薦我一些網頁或書籍來閱讀這些信息,或者發送一些示例代碼來學習?

你認爲我應該使用其他方法,比插座更好嗎?也許更高層次的庫(我會需要它的C + +和Java)或完全不同的方式?

編輯:

我會添加一些額外的信息。

我很想實現如下:

我的C++程序有一個主循環,在這裏我想有一個像GetUpdatedDataFromRemoteDevice()一個電話,我讀到以前得到了更新一些數值變量的新值從網絡(例如插座)。最終,C++程序需要向遠程設備發送一條消息,告訴他發送其他類型的數據,然後繼續獲取更新後的值。

從Java程序(遠程設備)運行的應用程序是一個交互式可觸摸屏幕,不能被網絡傳輸阻塞,因爲它必須爲用戶保持工作,所以所有的網絡應該在一個單獨的線程中完成。

該線程應該連接到服務器,並且當按下按鈕時,開始在循環中發送數據(4個數值改變),直到發生另一個事件。

很容易重新連接到服務器也不錯。

+0

網絡上有很多插座教程資料,只是谷歌它。在我們能夠給出詳細的答案之前需要更多細節。你需要發送什麼數量和頻率的數據?你說他們互相發送信息 - 這是否始終由客戶端發起,還是需要一個允許服務器將數據推送到客戶端的連接? – DNA 2012-02-05 21:00:49

+0

如果您要查找簡單易用的消息,請查看以下內容:https://public.msli.com/lcs/muscle/ – 2012-02-05 21:07:29

回答

1

我不知道你的應用程序是什麼,但健壯的客戶端服務器套接字編程是相當多毛的任務來做正確的。硬件字節順序,字符串編碼,網絡錯誤,重試,重複消息,acks等等。需要大量優秀的設計和仔細的編程。在使用多線程之前,你需要像單線程一樣工作。

除非您需要從服務器到客戶端的即時通知,否則我建議您使用HTTP作爲客戶端和服務器之間的協議。客戶端可以偶爾輪詢服務器以查找新消息。

無論如何,這個問題已經被多次解決了。

http://activemq.apache.org/

http://www.rabbitmq.com/devtools.html

http://www.cs.wustl.edu/~schmidt/ACE-overview.html

+0

另請參閱:http://code.google.com/apis/protocolbuffers /,用於跨語言一致的序列化。 Protobufs真的很可愛,因爲它們以適當的風格生成各種語言的Java和C++ API,因此每種語言都可以翻譯單個消息格式規範。 – 2012-02-05 21:20:44

+0

確實,協議緩衝區對於編碼編碼來說很好,但它們並不能解決通常更棘手的網絡部分。 – 2012-02-05 21:27:19

+0

同意。但是,Wire編碼,即使它並不棘手,絕對是一個痛苦 - 尤其是如果你想要一個緊湊的編碼。只是覺得值得一提。 – 2012-02-05 21:29:03

0

我做這種事一次。在我的情況下,使用JNI將我的C++應用程序連接到本地Java應用程序更容易,然後讓這兩個Java應用程序相互交談。

3

ICE是分佈式應用的現代化和良好的庫:

  • 更多的語言C++和Java
  • 許多平臺
  • GNU GPL
  • 不錯的表現
  • 使用方便

首先,你定義你想要在服務器和客戶端之間交換的消息。
然後,您將實現C++和Java源代碼來處理這些消息。在http://zeroc.com/ice.html

更多信息好玩;-)

編輯:我在一些項目中使用ACE。我可以告訴ACE很老舊,也許成熟,但是使用過時的C++編碼規則:-( 因此,ACE不如STLBOOST。此外,ACE並不是非常有效率......我更喜歡ICE ;-)

相關問題