2012-06-02 78 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

相关问题