Как запустить приложение на сервере

Программирование Web-приложений и Web-сервисов.

Модератор: Ramzes

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Как запустить приложение на сервере

Сообщение ANDLL » 22.12.2009 (Вт) 19:50

WCF сервис это обычный windows-сервис
WCF сервис и windows сервис связаны как стол и ваза.
Стол может быть без вазы, ваза может стоять не на столе, хотя конечно ваза на столе то же может стоять
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Re: Как запустить приложение на сервере

Сообщение ndemidov » 22.12.2009 (Вт) 19:51

ndemidov писал(а):Думаю хороший вариант - сделать .exe приложение,
Сервис это как правило и есть exe.


Э.. я мел ввиду destop'ную программу, типо как в WoW или Perfect World, когда клиент скачивал другу. Вот так можно было бы.

Antonariy писал(а):
ndemidov писал(а):но я не знаю одного: как будет происходить связь между .exe-клиентом и тем, что будет "крутиться" на сервере.
Interprocess communication

Так это же про Межпроцессное взаимодействие... А я думаю мне надо про то как посылаются и принимаются данные через интернет от destop'ной программы к приложению, работающему на сервере (типо ASP.NET-приложения). Это, наверно, как само собой разумеющееся надо бы знать...
Большинство людей не понимает, что великое многообразие и красочность мира будут служить им крепчайшей душевной поддержкой на протяжении всей жизни. Иван Ефремов

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Re: Как запустить приложение на сервере

Сообщение FaKk2 » 22.12.2009 (Вт) 21:59

ANDLL писал(а):
IIS создает новый процесс на каждый http запрос - представляешь сколько памяти сожрется при более-менее активном пользовании?
Это бред.
Нуи все остальное что основывается на этой предпосылке


RTFM

Это раз, да и я имел ввиду поток, а не процесс.

По поводу "вазы и стола", RTFM #2

Видимо надо разжевать на примерах.

ndemidov, для успешной реализации тебе нужно развести движок игры на разные стороны. С одной стороны тебе надо обрабатывать запросы клиентов. С другой стороны тебе надо постоянно делать различные игровые процессы на бекграунде. Например "переводить" игрока из одной локации в другую, строить дома, развивать NPC и т.д.

Как это сделать? Движок игры должен работать непрерывно, т.е. это не может быть ASP.NET, или десктопное приложение. Движку не нужен UI и он вообще должен уметь работать вне юзер контекста. Логичный вариант использовать старый добрый виндовый сервис. Он умеет работать без какого либо участия со стороны пользователя, стартует с системой и все дела. Соответствующуй проект в VS так и называется - Windows Service. Дальше вопрос, каким образом наладить канал связи между сервисом и асп.нет приложением? Раз мы пользуемся дотнетом, логично воспользоваться новой фичей именуемой WCF Service (Windows Communication Foundation). Этот WCF сервис нужно где-то хостить, но нам гадать не нужно, мы уже определились с хостом - это наш Windows Service.

Дальше, зачем я упомянул blocking queue? Затем, чтобы организовать асинхронную обработку запросов. Приходит запрос, wfc сервис загоняет его в очередь. А очередь обрабатывается в непрерывном цикле. Для клиента запрос/ответ приходит моментально, и не тормозит (т.к. очередь обрабатывается в отдельном потоке).

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

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Как запустить приложение на сервере

Сообщение ANDLL » 22.12.2009 (Вт) 23:11

Это раз, да и я имел ввиду поток, а не процесс.
Угу, одно и то же. Ну и тогда при чем тут "много ресурсов и прочая фигня"?
А теперь прочитаем
Увеличивать этот тайм-аут чревато, поскольку IIS создает новый процесс на каждый http запрос - представляешь сколько памяти сожрется при более-менее активном пользовании?
И сколько же сожреться?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Re: Как запустить приложение на сервере

Сообщение ndemidov » 23.12.2009 (Ср) 15:25

* Создал Windows Service проект, пропишу туда логику. Как его заставить "вращаться" на сервере?
Вот дальше не смог :)


В-общем, примерчик было бы здорово. :alien:
Большинство людей не понимает, что великое многообразие и красочность мира будут служить им крепчайшей душевной поддержкой на протяжении всей жизни. Иван Ефремов

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как запустить приложение на сервере

Сообщение Antonariy » 24.12.2009 (Чт) 15:59

ANDLL писал(а):
Увеличивать этот тайм-аут чревато, поскольку IIS создает новый процесс на каждый http запрос - представляешь сколько памяти сожрется при более-менее активном пользовании?
И сколько же сожреться?
По-хорошему нисколько :)
Я такие вещи не писал, но заставил бы сервис просто пересчитывать определенные значения в базе, которые asp-приложение будет из нее извлекать и отдавать клиенту. Теоретически вообще всю игровую логику можно запихнуть в sql, а пересчет запускать sql-агентом. И обойтись без сервиса. Но наверное это будет медленно.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как запустить приложение на сервере

Сообщение Antonariy » 24.12.2009 (Чт) 16:06

ndemidov писал(а):
ndemidov писал(а):Думаю хороший вариант - сделать .exe приложение,
Сервис это как правило и есть exe.


Э.. я мел ввиду destop'ную программу, типо как в WoW или Perfect World, когда клиент скачивал другу.
Причем тут это? Мы же о сервере говорим, а не о клиенте. А клиент WOW вообще не занимается игровой механикой. Он занимается игровыми ресурсами и графикой.


ndemidov писал(а):
Antonariy писал(а):
ndemidov писал(а):но я не знаю одного: как будет происходить связь между .exe-клиентом и тем, что будет "крутиться" на сервере.
Interprocess communication

Так это же про Межпроцессное взаимодействие... А я думаю мне надо про то как посылаются и принимаются данные через интернет от destop'ной программы к приложению, работающему на сервере (типо ASP.NET-приложения). Это, наверно, как само собой разумеющееся надо бы знать...
Это я прочитал не правильно. Я имел ввиду ASP-приложение и сервис, крутящиеся на одном сервере.
Лучший способ понять что-то самому — объяснить это другому.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Как запустить приложение на сервере

Сообщение FireFenix » 24.12.2009 (Чт) 18:34

ndemidov писал(а):* Создал Windows Service проект, пропишу туда логику. Как его заставить "вращаться" на сервере?
Вот дальше не смог :)


В-общем, примерчик было бы здорово. :alien:

Для таких целей есть cron или Task Scheduler... и смысл в этом?

И вообще в чём проблема у автора? после прочтения 1,5 страницы постов я так и не понял :?

- берём к примеру vb.net и юзаем HttpWebResponse и HttpWebRequest
- посылаем запрос на страницу http://game.ru и на ASP формируем базовый текст http страницы в виде JSON или юзерского формата
обрабатывает ехешником запрос и выводим на экран.
- Юзер нажимает кнопочку, к примеру 1 и мы посылаем запрос на сервер по адресу http://game.ru с параметрами ГЕТ или ПОСТ типа location=1&action=1
ASP обрабатывает и выводит очередной запрос, который мы обрабатываем в ехешнике... и так в рекурсии
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Re: Как запустить приложение на сервере

Сообщение ndemidov » 25.12.2009 (Пт) 14:38

А можно пример как использовать HttpWebResponse и HttpWebRequest для передачи данных/текста?
Большинство людей не понимает, что великое многообразие и красочность мира будут служить им крепчайшей душевной поддержкой на протяжении всей жизни. Иван Ефремов

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Как запустить приложение на сервере

Сообщение FireFenix » 25.12.2009 (Пт) 18:12

ndemidov писал(а):А можно пример как использовать HttpWebResponse и HttpWebRequest для передачи данных/текста?

http://www.rsdn.ru/article/inet/httpweb.xml
и от МС
http://msdn.microsoft.com/en-us/library ... quest.aspx
http://msdn.microsoft.com/en-us/library ... ponse.aspx
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Re: Как запустить приложение на сервере

Сообщение FaKk2 » 27.12.2009 (Вс) 7:11

В аттачменте обещанный пример. Долго думал что привести для наглядной демострации и в конце концов сделал случайное закрашивание игрового поля. Поле представление классом GameField (размер по умолчанию 20х20 клеток), закрашеная клетка классом NPC (от non player character). Добавление нпсов на поле реализуется через вышеупомянутый blocking queue.

Как устанавливать?
1. Распаковать
2. Открыть солюшн в студии сделать GameWebApp запускаемым по-умолчанию.
3. Нажать Ctrl-B (компилирования солюшна).
4. Открыть VS2008 Command Prompt
5. Используя InstallUtil.exe установить SampleGame\GameService\bin\Debug\GameService.exe в качестве сервиса в систему. Например: InstallUtil.exe "C:\SampleGame\GameService\bin\Debug\GameService.exe"
6. Открыть окно сервисов и запустить оттуда GameService
7. Нажать Ctrl-F5.

Как использовать?
1. В открывшемся окне браузера будут видны список цветов, кнопка "добавить", и кнопка "добавить 10 случайных".
2. Выбрать цвет, нажать "Add". После обновления поля выбранных цветом закрасится случайная клетка в поле.
3. Нажать "Add random 10 NPCs". После обновления, должно закраситься 10 случайных клеток случайных цветом.

Как оно работает?
Поскольку код достаточно тривиален, я не сильно разбавлял его комментариями. Как я уже говорил ранее, проект разделен на две части, ASP.NET веб-приложение в качестве фронтенда, и WCF сервис захостенный в Windows сервисе в качестве бэкенда. В интерфейсе IWcfService определены несколько методов посредством которых происходит коммуникация между этими частями. Конкретно это AddNPC и GetGameField. Метод AddNPC добавляет нового кандидата в очередь которая обрабатывается в непрерывном цикле. Причем обработка цикла идет в отдельном фоновом потоке который суспендится когда очередь пуста. Метод GetGameField просто возращает обьект игрового поля. Имей ввиду что все классы и их методы, которые участвуют в коммуникации должны быть обрамлены аттрибутами DataContract и DataMember.

Теперь немного танцев с бубнами.
Каким образом обе части знают друг о друге? Используя app.config и web.config конечно! В app.config (ту бишь в конфигурации сервиса) смотри секцию system.serviceModel\services, а в web.config смотри system.serviceModel\client. Если отбросить весь мусор, самая важная часть это адрес эндпоинта: address="http://localhost:6666/npc" и контракт: contract="GameService.IWcfService". Оба эти параметра должны совпадать у сервера и клиента. В нашем случае сервер это Windows сервис, а клиент это ASP.NET приложение.

Disclaimer
Т.к. пример был набросан на скорую руку, я пошел по пути меньшего сопротивления и при каждом обновлении генерирую всю таблицу. При обновлении раз в секунду набегает порядка мегабайта траффика в минуту (судя по firebug'у), что конечно является недопустимой растратой ресурсов в реальном мире. Но на то и существуют примеры, не так ли? :)
Вложения
SampleGame.rar
Обещанный пример с WCF и ASP.NET
(84.92 Кб) Скачиваний: 330
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

ndemidov
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 14.11.2007 (Ср) 16:23
Откуда: Earth planet

Re: Как запустить приложение на сервере

Сообщение ndemidov » 09.01.2010 (Сб) 10:58

Привет всем, у меня возник вопрос по записи файла на сервер.

ANDLL писал(а):В чем проблема то программно генерировать число раз в x времени и кидать в файл?
Timer и IO.FileStream

Я использую код
Код: Выделить всё
' Сохранить в файл
        Try
            My.Computer.FileSystem.WriteAllText(My.Computer.FileSystem.CurrentDirectory & "\sav.txt", "Hello, World!", False)
        Catch ex As Exception
            msg(ex.Message) : Exit Sub
        End Try


Как мне узнать путь, где находится программа? В Windows Forms я делал так:
Код: Выделить всё
My.Application.Info.DirectoryPath


И второй вопрос: я, например, буду хранить данные об игроках и пароли от них, соответственно, нельзя, чтобы кто-то мог скачать их с сервера как с обычные файлы. Как сделать их доступными только для программы?


ADDED:
Путь к приложению: My.Request.PhysicalApplicationPath
Большинство людей не понимает, что великое многообразие и красочность мира будут служить им крепчайшей душевной поддержкой на протяжении всей жизни. Иван Ефремов

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: Как запустить приложение на сервере

Сообщение VVitafresh » 11.01.2010 (Пн) 12:58

ndemidov писал(а):И второй вопрос: я, например, буду хранить данные об игроках и пароли от них, соответственно, нельзя, чтобы кто-то мог скачать их с сервера как с обычные файлы. Как сделать их доступными только для программы?

Например, хранить эти данные в базе данных.

А еще почитать: ASP.NET Authorization
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Пред.

Вернуться в ASP.NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList  
cron