Запустить Socket Script на нескольких портах

Что я хочу сделать, это запустить следующий скрипт на каждом порту, 1025+. Я занимаюсь созданием приложения для блэкджека для iPhone, которое взаимодействует с этим скриптом для онлайн-игр. Дело в том, что я хотел бы поставить это на каждый порт вручную, изменив порт для прослушивания каждый раз для всех портов. Как я могу сделать так, чтобы на каждом порту была новая таблица. У каждой таблицы есть идентификатор, который приложение будет проверять, чтобы увидеть количество игроков и кто находится за столом.

Сокет устанавливает идентификатор для класса Table, но мне нужно быть на нескольких портах, чтобы иметь возможность поддерживать эту таблицу и сохранять все движения игроков и тому подобное.

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

class Table:
    def __init__(self, id):
        self.players = []
        self.positions = {'1': '', '2': '', '3': '', '4': ''}

    def sit(self, player_id, position):
        self.positions[position] = player_id

# --------------------------------------------- #
# --------------------------------------------- #


class Socket(Protocol):
    def connectionMade(self):
        #self.transport.write("""connected""")
        self.factory.clients.append(self)
        print "Clients are ", self.factory.clients

    def connectionLost(self, reason):
        self.factory.clients.remove(self)

    def dataReceived(self, data):
        #print "data is ", data
        a = data.split(':')
        if len(a) > 1:
            command = a[0]
            content = a[1]



            msg = ""

        print msg

        for c in self.factory.clients:
            c.message(msg)

    def message(self, message):
        self.transport.write(message)


factory = Factory()
factory.protocol = Socket
factory.clients = []

reactor.listenTCP(1025, factory)
print "Blackjack server started"
reactor.run()

1 ответ

Решение

Отвечая на ваш вопрос

Ты спрашиваешь:

  • Как я могу заставить этот скрипт работать на каждом порту?
  • Как я могу изменить порт прослушивания самостоятельно?
  • Как я могу заставить Python самостоятельно создавать все таблицы на каждом порту?

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

factories = [ ]
for i in range(0, NUM_TABLES):
    factory = Factory()
    factory.protocol = Socket()
    factory.clicents = []
    factories.append(factory)
    reactor.listenTCP(1025 + i, factory)
    reactor.run()

Вы используете классы, поэтому каждая фабрика ведет свой список клиентов, у каждого есть свой экземпляр Socket для управления соединением. Вы не показываете, как Table экземпляры создаются, но каждый экземпляр Socket или Factory создает и поддерживает ссылку на Tableэто должно позволить вам иметь несколько соединений, каждое из которых имеет свое собственное состояние.

Сохраняя список всех фабрик, вы можете перебирать их, чтобы составить список запущенных игр и т. Д.

Учитывая другую архитектуру

Хотя вышеперечисленное может работать, это не то, как системы клиент-сервер обычно проектируются. В частности, ваша система требует, чтобы ваш клиент знал, какой порт использовать. Это может сработать ad hoc, когда вы все вместе в своей гостиной, но это утомительно и не будет масштабироваться в целом.

То, что вам нужно, это что-то вроде веб-сервера, который прослушивает один порт для установления соединения, а затем сообщает клиенту: "эй, у вас идентификатор таблицы 25, используйте это всякий раз, когда вы хотите поговорить". Кроме того, это означает предоставление клиенту списка таблиц, чтобы они могли выбрать одну из них. И вы можете получить от этого больше удовольствия: специальный истекающий cookie-файл, который выдается клиенту, чтобы он случайно не взломал / не нарушил игру, частью которой он больше не является, и т. Д.

Другие вопросы по тегам