Предположим, у меня есть простая однопользовательская текстовая RPG, которая работает как консольное приложение. Более упрощенно псевдокод:Как преобразовать сложный поток программы в безстоящий для Интернета?
...
while (character.hp > 0 and monster.hp > 0)
console.write("Attack, Magic, Run?")
character.doAction(console.read())
monster.attack(character)
... etc. ...
Теперь, скажем, я хочу, чтобы превратить это в многопользовательской онлайн-игры. На сервере, я могу каждый клиент работать в своем собственном потоке, а код не изменится:
...
while (character.hp > 0 and monster.hp > 0)
socket.send("Attack, Magic, Run?")
character.doAction(socket.receive())
monster.attack(character)
... etc. ...
Это работает, но есть две проблемы:
- Имея один поток на одного клиента, как правило, не рекомендуется, потому что он плохо масштабируется.
- Написание собственного сервера сокетов и клиента - это боль.
Таким образом, игра, запускаемая на веб-сервере, решает обе эти проблемы, но она вводит новую: Интернет по сути является без гражданства. Насколько я могу судить, мне пришлось бы преобразовать поток потоковой программы в конечный автомат, вытащить состояние из базы данных в начале каждого запроса и затем сохранить измененное состояние в базе данных в конце обработчика запроса , Это кажется еще более болезненным, чем создание настраиваемого сервера сокетов. Итак, мой вопрос: есть ли какой-либо нелестный способ достичь этого? В идеале, было бы решение, которое позволило бы мне оставить простой псевдокод сверху почти неизменным. Я открыт для предложений на всех языках и/или платформах.
Я выбрал код и щелкнул фигурные скобки для вас. –
Обратите внимание, что на конечный автомат есть только два состояния и только одно событие. Штатами являются «ожидание» и «завершение», а событие - «входящий запрос». Возможно, это не так сложно, как вы себе представляете. Подумайте о том, чтобы переставить свою петлю, поэтому send() находится внизу и «doAction()» вверху. Некоторым, если в первый раз пропустить верхнюю часть или если запрос не делает ничего интересного. –
Да, для этого конкретного примера это не слишком сложно. Но это был просто упрощённый пример, и, как вы можете себе представить, по мере того, как поток программ становится более сложным, становится все труднее. –