#python #multithreading #sockets #server #global-variables
Вопрос:
Я создаю онлайн-игру в угадывание флага с помощью сокетов. Код сервера ниже (извините за вставку всего кода, я тестировал и буквально понятия не имею, в чем может быть проблема):
import socket import threading import random from time import sleep from func import get_flags flags = get_flags() flag_names = [i for i in flags] current_flag = " " show_answer = False errorCounter = 0 HEADER = 64 PORT = 5050 SERVER = socket.gethostbyname(socket.gethostname()) ADDR = (SERVER, PORT) FORMAT = 'utf-8' server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(ADDR) players = [] num_of_players = int(input("Number of players: ")) def handle_client(conn, addr): global show_answer, current_flag print(f"[NEW CONNECTION] {addr} connected.") connected = True player = () while connected: print(current_flag) msg_length = conn.recv(HEADER).decode(FORMAT) if msg_length: msg_length = int(msg_length) msg = conn.recv(msg_length).decode(FORMAT) #print(f"[{addr}] {msg}") msg = msg.lower() msg = msg.split(" ") try: if msg[0] == "!set_username" and len(msg) gt; 1: player = (msg[1], addr) players.append(player) elif msg[0] == "!get_flags": conn.send(str(flags).encode(FORMAT)) elif msg[0] == "!ready": conn.send(str(len(players) gt;= num_of_players).encode(FORMAT)) elif msg[0] == "!get_current_flag": conn.send(current_flag.encode(FORMAT)) elif msg[0] == "!show_answer": conn.send(str(show_answer).encode(FORMAT)) except Exception: print("asd") #conn.send("Msg received".encode(FORMAT)) players.remove(player) conn.close() def start(): global show_answer, current_flag server.listen() print(f"[LISTENING] Server is listening on {SERVER}:{PORT}") while len(players) lt; num_of_players: conn, addr = server.accept() thread = threading.Thread(target=handle_client, args=(conn, addr)) thread.start() print("nThe game has started.n") while True: sleep(3) show_answer = False current_flag = random.choice(flag_names) sleep(10) show_answer = True if __name__ == "__main__": print("[STARTING] server is starting...") start()
Моя проблема в том, что: Когда я вызываю функцию start() и лобби заполняется, начинаются «игровые часы», которые определяют, сколько времени у игроков есть, чтобы угадать флаг, и время, в течение которого они могут увидеть правильный ответ. Когда я изменяю эти переменные (show_answer и current_flag), они меняются, но не в in handle_client(). Это почему?
Клиент может нормально подключаться, но не может видеть обновленные переменные. Я использую Python 3.9.5, если это поможет.
Комментарии:
1. В
handle_client
: Есть опечаткаshow_awnser
…2. да, я понял, что awnser не был правильным способом написания ответа при публикации этого, поэтому я быстро изменил имена переменных и оставил это, поэтому опечатка была создана во время публикации lol
3.
global
переменные обычно не рекомендуется использовать, так как они могут вызвать множество проблем. Возможно, вам захочется рассмотреть другой подход, например, класс с переменными экземпляра, для вашего кода.