2012-06-02 2 views
0

Прошу прощения за хроническое название, но через 15 минут, пытаясь найти лучшего, я просто сдался.
Представьте себе следующий сценарий:Лучшее решение для реализации «на лету» клиент-серверной связи?

  • Desktop приложение A, написанное на C# слушает пользователь говорить и преобразует WAV файла на куски (byte[]) как речь происходит
  • A затем необходимо отправить эти куски к серверу B (наш сервер Windows) , поскольку речь все еще происходит
  • Сервер B ожидает, что все куски поступят (после выступления завершение), затем оборачивается и делает один HTTP POST на сервере C (сторонний речевой движок речевого текста) со всем byte[] представлением речи
  • Сервер B получает ответ и выполняет некоторую работу с результирующей строкой, затем отправляет обратно объект обратно в настольное приложение A (может быть строкой или изображение)

Одним из требований (заявлений выделены жирным шрифтом) является то, что для повышения эффективности, A не должны ждать, пока речь будет завершена перед началом отправки кусков до B.

Мы собрали тестовое решение, которое использует TCP-сокеты (похоже, все в порядке), но поскольку у нас очень мало опыта работы с сокетами, мы немного неохотно (не уверены обо всех ограничениях).

Есть ли лучшее предложение для достижения нашей цели?

PS: Еще одно требование, что еще должно быть подтверждено, может быть, что A быть записаны в «неуправляемый» C++, которые, вероятно, предотвратить любые чисто .NET реализации

ответ

0

Я мог (как дуплексных служб WCF в?) подумайте о нескольких изменениях, которые должны быть сделаны, и я думаю, что это улучшит производительность клиента/сервера.

Во-первых, вместо того, чтобы послать byte[] от A к B и ждет все куски, которые будут отправлены, вы должны послать byte[] от A к C тогда ждет все пакеты, которые будут отправлены.


Вот диаграмма, которая должна помочь:

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 делать какие-либо «вещи» для меня, как предлагалось в № 2, или иметь C вперед ответ к B, как предложено в № 1. Пожалуйста, дайте мне знать, если я неправильно понял ваш ответ! :) – BlazingFrog

+0

Ах, я вижу. Если у вас нет ответа C на ответ B, то как вы получите ответ в своем сценарии? Он говорит, что B делает HTTP POST-запрос серверу C ... Сервер B получает ответ. – 3aw5TZetdf

0

Я написал сетевую библиотеку, которая позаботится о всех подробностях сети gory для вас (она быстрая и асинхронная).

все, что вам нужно сделать, это управлять передаваемой/полученной информацией.

Вот введение: http://blog.gauffin.org/2012/05/griffin-networking-a-somewhat-performant-networking-library-for-net/

Смежные вопросы