Асинхронная связь между двумя приложениями - PullRequest
4 голосов
/ 19 сентября 2010

Я пишу простую маленькую игру для своих детей - на самом деле не имеет значения, что она делает, хотя я все равно не могу вам сказать, поскольку я / они еще не совсем решили!Тем не менее, я думаю, что он будет иметь серверный компонент и ряд клиентских компонентов, и я ищу способы взаимодействия клиентов с сервером.

ВЕСЬ мой предыдущий опыт ... фактически вся моя карьера ... включала серверный элемент, будь то база данных, веб-сервер или два в тандеме.Ни один из них не подходит в этом случае, поэтому мне любопытно, какие средства я мог бы и должен использовать для связи между ними.

Очевидно, что было бы предпочтительнее принять технологию или технику, которую я могу повторно использовать.использовать в моей работе, где я все больше работаю с Windows Forms.Я предполагаю, что есть 1001 различных подходов, которые я мог бы принять;это вопрос сортировки пшеницы из соломы.

Я буквально только начал читать о WCF, но пока неясно, нужен ли мне этот ориентированный на сервис подход.

Я намеренно не знаю, что будут делать приложения;Я ожидаю, что клиент объявит о своем присутствии на сервере, передаст выбор пользователя на сервер, и, в свою очередь, сервер будет периодически обновлять клиента тем, что происходит в более широкой игре.Игра будет пошаговой, а не в реальном времени ... и действительно довольно технологичной!

Предложения?В идеале, со ссылками на хорошие учебные ресурсы, если таковые имеются.

Вывод: я действительно думал, что могут быть более жизнеспособные альтернативы;есть Remoting (в настоящее время осуждаемый), но консенсус говорит, что WCF - это то, что нужно - в моем случае, сам хостинг выглядит привлекательно.

Спасибо за ответы.

Ответы [ 6 ]

3 голосов
/ 19 сентября 2010

Похоже, вы заинтересованы в WCF, и в данном случае это разумная технология.

При написании сетевой игры самый простой подход - использовать здесь и подход клиент-сервер.С WCF у вас есть несколько различных возможностей хостинга, хостинга в IIS или самостоятельного хостинга.Я бы пошел на сам хостинг, чтобы избежать необходимости IIS на ваших домашних компьютерах.

Служба может быть размещена либо в службе Windows, либо фактически в одном из клиентов.Я рекомендую работать как служба Windows.Служба вполне может работать на одном компьютере с одним из клиентов.

Редактировать:
Если вы хотите разместить сервер на одном из клиентов, вы можете предоставитьПункт меню «Запустить службу», который запускает на этом компьютере службу self-hosted (и автоматически подключает клиентскую часть к localhost).После запуска службы вы можете указать имя компьютера, которое вы вводите на «других» компьютерах для подключения.

Я бы предложил разделить служебную часть на отдельный проект, после чего вы можете легко выделить службупозже, если хотите, в службу Windows.

Edit2:
Кстати, поскольку WCF управляется вызовами от клиента, вам необходимо опросить сервер на предмет изменений.Вы можете использовать google wcf long polling или просто long polling , чтобы узнать, как "перенаправить" сообщения с сервера на клиент.

2 голосов
/ 19 сентября 2010

Ознакомьтесь с этой статьей о создании приложения для чата с использованием WCF - http://www.codeproject.com/KB/IP/WCFWPFChatRoot.aspx

В прошлом я играл с этим кодом, и проект был довольно прост для локального запуска.

1 голос
/ 19 сентября 2010

Я собираюсь пойти против толпы здесь и предложение НЕ использовать WCF. WCF - это отличная технология для сервис-ориентированной архитектуры, однако в значительной степени она основана на идее, что клиенты не будут оставаться подключенными к серверу, а скорее подключатся, отправят сообщение, возможно получат результат и отключатся.

Существует механизм, который можно использовать для клиентов с длительным подключением, но, честно говоря, он не очень хорошо работает, имеет всевозможные проблемы и причуды, и не очень надежен с точки зрения того, когда клиенты отключились или нет или знают ли клиенты, подключены ли они к серверу. Это более надежное решение, которое пытается внедрить себя в модель WCF.

Другая проблема связана с брандмауэрами. Между инициатором и получателем не может быть брандмауэра (или должен быть открытый порт). Это означает, что вы не можете легко иметь двух клиентов за брандмауэрами, которые хотят общаться друг с другом. Вам нужен какой-то открытый промежуточный сервер, который открыт. Хотя эта проблема относится ко всем решениям, проще управлять с помощью прямых TCP-соединений, чем WCF.

Я не большой сторонник развертывания вашего собственного решения, но WCF действительно перебор для простой двусторонней связи между клиентскими приложениями.

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

Проблема в том, что в последних версиях .NET добавлено множество новых сетевых функций, особенно в плане асинхронной поддержки. На данный момент я не видел библиотек, которые реализуют эти функции.

Кто-нибудь хочет помочь мне с нуля создать хорошую сетевую библиотеку на основе .net 3.5 +?

1 голос
/ 19 сентября 2010

Здесь - хорошая книга о WCF, которая может помочь вам начать. В нем есть немного кривой обучения (я сам еще немного поцарапал поверхность), но я чувствую, что это очень мощный способ настройки приложения, основанного на службах. На странице, на которую я ссылаюсь, посмотрите ссылку «Примеры», которая включает в себя кучу кода из книги, в том числе Juval's ServiceModelEx, который имеет широкий спектр полезных классов для работы с WCF.

0 голосов
/ 11 октября 2010

Вы также можете использовать связь через сообщения с помощью Eneter Messaging Framework.Фреймворк действительно легкий, простой в использовании и поддерживает различные коммуникационные сценарии (односторонняя связь, запрос-ответ, публикация-подписка, ...).Он может общаться через Named Pipes, Tcp или Http, а также может использоваться для связи между потоками.

Если вам интересно, вы можете проверить текст ссылки .

0 голосов
/ 19 сентября 2010

Я бы посмотрел на Remoting, если бы я был тобой. Это довольно легко реализовать, и вы можете использовать его на работе.

Здесь есть учебник: http://generally.wordpress.com/2007/05/31/a-simple-remoting-example-in-c/

...