2012-06-02 112 views
0

我爲跛腳冠軍道歉,但經過15分鐘努力尋找更好的冠軍後,我放棄了。
想象以下場景:實現「即時」客戶端 - 服務器通信的最佳解決方案?

  • C#編寫的桌面應用A監聽用戶講話和WAV文件分割成塊(byte[]轉換爲語音發生
  • A則需要發送這些數據塊到服務器B(我們的Windows服務器)當語音仍在發生時
  • 服務器B等待所有的塊到達完成),然後轉向並向服務器C(第三方語音到文本識別引擎)發送一個HTTP POST,其中整個byte[]表示語音
  • 服務器B獲取響應,並對結果字符串進行一些處理,然後發回一個對象回到桌面應用A(可能是一個字符串或圖像)

的要求之一(粗體語句)的是,爲了提高效率,A不應等待完成演講在開始發送塊到B之前。我們整合了一個使用TCP套接字的測試解決方案(似乎工作正常),但由於我們對套接字的使用經驗很少,所以我們有點不情願(不確定所有限制)。

有沒有更好的建議來達到我們的目的?

PS:另一項要求,仍需要進一步證實,可能是A在「非託管」 C++這可能會阻止任何純粹的.NET實現寫入

回答

0

我可以(像WCF的雙工服務?)想到要做一些改變,我認爲它會改善客戶端/服務器的性能。

首先,而不是發送從Abyte[]B,等待發送的所有數據塊,你應該從AC發送byte[]然後等待發送的所有數據包。


這裏有一個圖表,應該幫助:

A -> C (waits for all packets) -> B (does some stuff to the string) -> A 


如果你不需要服務器 B,那麼你可以做這樣的事情:

A -> C (waits for all packets, then does some stuff to the string) -> A 


這裏是你是什麼目前在做:

A -> B (waits for all packets) -> C -> B (does some stuff to the string) -> A 

第一個想法是你只發送數據包3次,第二個想法只有2次,在你的實現中你要發送數據包4次。儘管發送數據包的次數在所有情況下都無關緊要,但我認爲它會在這一次,因爲您需要它爲on-the-fly。所以發送少量數據包=更快的響應。

希望這有助於或給你一個想法!

+0

此外,將直接發送到C無需等待,那麼C將所有塊中發送給B. – 3aw5TZetdf

+0

感謝您的答覆馬修。我不認爲這兩個建議都可行,因爲我不控制C,而只控制A和B.因此,我不能像C#中那樣爲我做任何「東西」,或者讓C轉發響應如#1中所建議的那樣。如果我誤解了你的答案,請讓我知道! :) – BlazingFrog

+0

啊,我明白了。如果你不能讓C轉發對B的迴應,那麼你將如何在你的場景中得到迴應?它表示B向服務器C發出HTTP POST請求...服務器B獲取響應。 – 3aw5TZetdf

相關問題