Конференция "Прочее" » Вопросы про Питон, вебсокеты и клиент-серверную игру
 
  • Kolan © (08.05.17 11:35) [0]
    Заранее прошу прощения за глупые вопросы. Понимаю, что лучший ответ — позвать программиста, но я хочу разобраться сам.

    У меня есть клиент-серверная игра. Сервер на Питоне, клиент — сайт. Клиент и сервер общаются через вебсокет.

    На сервере используется Торнадо:
    main.py
    from tornado import websocket, web, ioloop

    from game import Game
    import json
    import os

    file = open(os.path.dirname(os.path.abspath(__file__)) + '/../conf/tornado.conf')
    config = json.load(file)
    file.close()

    app = web.Application([
    (r'/ws', Game),
    ])

    if __name__ == '__main__':
    app.listen(config['port'])
    ioloop.IOLoop.instance().start()




    game.py
    class Game(websocket.WebSocketHandler):
    ...

    def __init__(self, *args, **kwargs):
     """
     Создаёт объект Игры.
     """
     super(Game, self).__init__(*args, **kwargs)
     self.reset()



    На клиенте:
    var ws,
       sovietNumber = 0,
       previousColumnType,
       gameStatus = 'active';

    function startSocket() {
    ws = new WebSocket('ws://' + window.tornado.host + ':' + window.tornado.port + '/ws');
    ws.onopen = onSocketOpen;
    ws.onmessage = onSocketMessage;
     
    ws.onclose = function(event) {
     alert('***');
     checkSocket();
    }
    ;

    setInterval(checkSocket, 5000);
    }

    function checkSocket() {
    if (!ws || ws.readyState === WebSocket.CLOSED) {
     startSocket();
    }

    }



    Задача: если интернет пропал, переподключиться к той же игре, чтобы игрок продолжил играть.

    Код с checkSocket и переподключением через пять секунд написал я. Он не работает, потому что при переподключении игра начинается заново.

    Чтобы решить задачу мне не хватает понимания работы вебсокетов, клиент-серверной архитектуры и Питона. Вопросы:

    1. Когда срабатывает код в main.py? Кто и как отличает одного клиента от другого.

    2. Можно ли использовать встроенные идентификаторы вебсокета, чтобы переподключится к той же игре? Как это сделать, если можно.

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

    3. Правильно ли я понимаю, что мне придётся перестать наследовать Game от websocket.WebSocketHandler и где-то хранить список игр? Какой тут образ решения может быть?

    P. S. Привет старожилам форума, кажется прошло сто лет :-)
 
Конференция "Прочее" » Вопросы про Питон, вебсокеты и клиент-серверную игру
Есть новые Нет новых   [134431   +10][b:0][p:0.002]