Я создал онлайн игру агарио, по гайду из ютуба на яп python, с помощью библиотеки socket, я запускаю сначала сервер, позже клиент, у меня все работает, если я отключусь и подключусь я буду в той же самой комнате. Как сделать так чтобы было много комнат, например первая занята 10 игроками, это максимум для подключения к одной комнате, и нало чтобы меня перекинуло в другую комнату, как создавать много таких комнат? Это связано с портами, как на сервере Майнкрафт? То есть можно ввести айпи сервера и порт, если введешь другой порт то будешь уже в другой комнате, но на том же сервере. Как вообще называется такая структура?
# Максимальное количество игроков в комнате
MAX_PLAYERS = 10
# Словарь для хранения комнат
rooms = {
1: [],
2: []
}
# Функция для выбора комнаты
def get_available_room():
for room_id, players in rooms.items():
if len(players) < MAX_PLAYERS:
return room_id
return None
# Функция для обработки клиента
def handle_client(conn, addr):
print(f"Подключен: {addr}"
if room_id is not None:
rooms[room_id].append(conn)
conn.send(f"Вы подключены к комнате {room_id}".encode())
else:
conn.send("Нет доступных комнат. Пожалуйста, подождите.".encode())
conn.close()
return
try:
while True:
# Обработка сообщений от клиента (пример)
message = conn.recv(1024).decode()
if not message:
break
print(f"Сообщение от {addr}: {message}"
# Отправка сообщения всем игрокам в комнате
for player in rooms[room_id]:
if player != conn: # Не отправляем сообщение обратно отправителю
player.send(f"Игрок {addr} говорит: {message}".encode())
Слушаете, простейшему серверу пофиг на «комнаты», он обрабатывает все соединения сокетов одинаково. Комнаты — это у пользователей. А на сервере лишь логика взаимодействия со всеми. Вот сервер и должен объединять пользователей в группы на основе переполнения предыдущих и отправлять юзерам номер комнаты. Никакие разные порты для этого не нужны. Вы, судя по всему, очень плохо представляете, что вообще такое сервер в вашем приложении и что делает тот код, который вы сами же написали. Юзеров изначально 0.Когда кто-то подключается, становится 1. Создаём словарь (комнату) и ожидаем в нём трёх юзеров. Каждый последующий юзер добавляется в этот словарь или в последующий, если предыдущий «переполнен».При дисконнекте юзера (корректном или по пинг-понгу) сообщаем удаляем его из соответствующего словаря.Также делаем проверку при коннекте юзера сколько людей в каждом словаре-комнате: если кто-то вышел, то кидаем новичка на первое «свободное» местоВсе изменения сообщаем юзерам по сокетам.Когда юзер совершает какое-то действие, сервер проверяет, к какой комнате он относится, и применяет нужные изменения лишь в прогрессе этой комнаты. Отправляя изменения только её обитателям.Нужно вести ещё один общий словарь, где указывается номер комнаты пользователя в формате {"username": 3}, чтобы не бегать циклом по всем словарям в поисках юзера (а делать отправку номера своей комнаты юзером-клиентом нельзя по причинам безопасности).
Простейшая работа с циклами и словарями.
В реальных проектах, конечно, разные комнаты могут находится на разных физических или «логических» «серверах»-кластерах, может работать балансировщик нагрузки и прочее такое, но у вас такого нет и не будет. Но даже в этом случает порт один, а логику балансировки между кластерами берут на себя инструменты вроде кубернетеса, это девопс уже.