Запустить 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-файл, который выдается клиенту, чтобы он случайно не взломал / не нарушил игру, частью которой он больше не является, и т. Д.