Протокол двусторонней связи .NET в реальном времени

Мне нужно поддерживать соединение между сервером и несколькими клиентами, чтобы клиенты могли отправлять команды, а сервер запускал события. Сервер в основном представляет собой музыкальный проигрыватель, и клиенты отправляют такие команды, как «Play()», «Pause()», «GetPlaylists()» и т. д. Сервер на его стороне должен иметь возможность сообщать клиентам такие вещи, как «SongEnded» или «PlayerPaused». Кроме того, должна быть возможность отправлять некоторые данные туда и обратно (например, текущую песню, изображение альбома, списки воспроизведения и т. д.). Я мог бы, конечно, пойти дальше и создать сокет самостоятельно и создать свой собственный протокол для обработки всех вышеперечисленных сценариев, но есть вероятность, что кто-то уже сделал это до меня, поэтому я действительно хочу создать фреймворк для работы в реальном времени. связь между сервером и клиентом для .NET. Например, я просмотрел xml-rpc, но не уверен, как мне с этим справиться с «OnClientSend». Кроме того, если я не ошибаюсь, xml-rpc сделан в стиле REST. Я также смотрел на wcf, но, поскольку у меня нет опыта работы с ним, я не знаю, с чего начать и как разместить сервер в простом консольном приложении.

Важно. Клиент должен иметь возможность не быть .NET.
Важно: должна быть возможность подключения к Java (Android).
< strong>Важно! Основными платформами являются Windows (сервер и клиент) и Android (клиент).
Важно! Потоковая передача звука не производится. Тем не менее, изображения должны быть отправлены.

Любые идеи для решения будут оценены. Кроме того, если у вас есть ссылки на хороший фреймворк или описания того, как использовать компоненты, уже существующие внутри .NET, я был бы очень рад.

[Edit] Проблема в том, что при отправке данных через сокеты нет гарантии (совсем!), что отправленные вами пакеты будут прочитаны сервером одновременно. Я могу отправить 50, затем 100, затем снова 50 байт, но сервер может прочитать это как 200-байтовый фрагмент или сначала 100, затем 100 и т. проблема), что я получил целое сообщение (и ничего больше).


person Alxandr    schedule 07.09.2010    source источник


Ответы (4)


ZeroMQ хорошо подходит для решения вашей проблемы. Кажется, вы сами реализовали что-то подобное.

  • Библиотека Supersocket, которая действует как среда параллелизма.

  • Переносит сообщения через inproc, IPC, TCP и многоадресную рассылку.

  • Соединяйте N-to-N по шаблонам разветвления, публикации, конвейера и запроса-ответа.

  • Достаточно быстро для кластерных продуктов и суперкомпьютеров.

  • Асинхронный ввод-вывод для масштабируемых многоядерных приложений для передачи сообщений.

  • Большое и активное сообщество с открытым исходным кодом.

  • Более 20 языков, включая C, C++, Java, .NET, Python.

  • Большинство операционных систем, включая Linux, Windows, OS X.

  • Бесплатное программное обеспечение LGPL, коммерческая поддержка iMatix Corporation.

person Ed James    schedule 14.09.2010
comment
Да, но мне нужно, чтобы он работал на Android. - person Alxandr; 15.09.2010

Вам следует использовать WCF: http://msdn.microsoft.com/en-us/netframework/aa663324.aspx

person Community    schedule 07.09.2010
comment
Поддерживает ли он как двустороннюю связь, так и работу внутри консоли? - person Alxandr; 07.09.2010
comment
Оказывается, клиент должен быть Net, чтобы wcf мог использовать сокеты с двусторонней связью. - person Alxandr; 09.09.2010

Вы также можете просмотреть XMPP и веб-сокеты. XMPP не ограничивается только обменом сообщениями, вы всегда можете расширить его для своих собственных целей. WebSockets хорошо развиваются, поскольку они являются частью HTML5.

person ajay_whiz    schedule 14.09.2010

В итоге я создал свой собственный простой протокол, который легко могу реализовать на нескольких языках. Я добился желаемого результата, добавив дополнительный слой буферов с обеих сторон сокета, а затем отправив каждое сообщение, за которым следует последовательность байтов, которая сообщает другой стороне, что это был конец сообщения. Также я добавил идентификаторы в сообщение, чтобы включить специальное сообщение «$Return».

Сообщения представляют собой просто сериализованные классы с использованием xmlserializer. Классы генерируются из xsd.

person Alxandr    schedule 14.09.2010