Асинхронная связь между двумя приложениями

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

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

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

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

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

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

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

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


person CJM    schedule 19.09.2010    source источник


Ответы (5)


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

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

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

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

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

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

person Albin Sunnanbo    schedule 19.09.2010
comment
Отсутствие необходимости в каком-либо предустановленном программном обеспечении или службах (например, IIS и т. д.) является предварительным условием (извините, должно было быть явно). Кроме .NET Framework, конечно! Не был уверен, что на игровом сервере могут размещаться службы WCF ... предпочитаю, чтобы он работал в игре, если это возможно, - хотел, чтобы он был как можно менее инвазивным для хост-компьютера. - person CJM; 19.09.2010
comment
@CJM: я обновил свой ответ ссылкой, описывающей, как самостоятельно разместить службу WCF, которая должна помочь вам начать работу. - person Albin Sunnanbo; 19.09.2010
comment
Альбин. Спасибо за ссылку на самостоятельный хостинг. Думаю, это то, что нужно. - person CJM; 19.09.2010
comment
Хороший комментарий, но неправда, несмотря на необходимость «опроса» - вам просто нужно имплексировать дуплексную службу. - person Kirk Broadhurst; 11.10.2010
comment
@Кирк - спасибо. Я только начинаю изучать дуплексные услуги, и это выглядит многообещающе. - person CJM; 11.10.2010

Прочтите эту статью о создании приложения чата с помощью WCF — http://www.codeproject.com/KB/IP/WCFWPFChatRoot.aspx

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

person Jemes    schedule 19.09.2010

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

person Dan Bryant    schedule 19.09.2010

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

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

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

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

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

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

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

person Erik Funkenbusch    schedule 19.09.2010
comment
Как оказалось, моему приложению не нужно долго поддерживать соединение, а также ему не нужно пересекать брандмауэры (кроме встроенного в Windows варианта). Но я принимаю вашу точку зрения на борт. WCF кажется мне подходящим, но я непредубежден и рассмотрю любую альтернативу. - person CJM; 19.09.2010
comment
Что ж, если вы думаете, что WCF будет работать для вас, то довольно легко что-то придумать и запустить. Тем не менее, существует значительная кривая обучения, чтобы выйти за рамки шаблонных примеров. - person Erik Funkenbusch; 19.09.2010
comment
Рабочие проекты, как правило, торопятся и плохо спланированы, и их всегда нужно закончить еще вчера — на работе сложно научиться чему-то совершенно новому. Так что я пытаюсь подобрать один или два трюка в свободное время... крутая кривая обучения = стоящее знание в конце концов? - person CJM; 20.09.2010

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

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

person Wil    schedule 19.09.2010
comment
Удаленное взаимодействие — это старая школа, следует использовать WCF. - person Muhammad Hasan Khan; 19.09.2010
comment
msdn.microsoft.com/en-us/library/kwdt6w2k.aspx говорит, что удаленное взаимодействие устарело, WCF является заменой. - person Albin Sunnanbo; 19.09.2010
comment
Интересно, спасибо за ссылку. Я больше думал о одноранговой ситуации с двумя рабочими столами, но я посмотрю на WCF :). - person Wil; 19.09.2010