Однако, когда я запускаю код, он иногда работает, а иногда нет. .
Вот фрагменты кода, которые я считаю важными.
Этот фрагмент находится в функции, которая обрабатывает новые соединения (server.py)
h1>
Он получает введенное пользователем имя пользователя и проверяет его на достоверность.
Затем он отправляет обратно строковое значение, представляющее текст, который необходимо ввести для отключения.
Код: Выделить всё
new_socket, addr = server_socket.accept()
username_is_taken = False
entered_username = new_socket.recv(8).decode()
for client in client_sockets:
if client[1] == entered_username:
username_is_taken = True
if username_is_taken:
new_socket.send("/USER_TAKEN".encode())
new_socket.close()
continue
else:
new_socket.send("/USER_OK".encode())
if len(client_sockets) == args.max_clients:
new_socket.send("/CHATROOM_FULL".encode())
new_socket.close()
continue
else:
new_socket.send("/CHATROOM_OK".encode())
new_socket.send(args.disconnect_message.encode())
print("sending disconnect_message...")
Код: Выделить всё
while True:
username = input("Enter your username (max 8 characters) - Others will be able to see this!\n")
my_socket.send(username.encode())
username_is_valid = my_socket.recv(64).decode()
chatroom_is_valid = my_socket.recv(64).decode()
if chatroom_is_valid == "/CHATROOM_FULL":
print("The chatroom is currently full, try again later.")
my_socket.close()
exit()
if username_is_valid == "/USER_TAKEN":
print("This username is taken, try something different!")
continue
break
print("Sucessfully connected to server!")
disconnect_message = my_socket.recv(64).decode()
print(f"Enter '{disconnect_message}' to disconnect!")
С серверным кодом все в порядке, он работает и ждет соединения.
НО! Когда я запускаю клиент, он запрашивает имя пользователя, и после того, как пользователь вводит его, он иногда проходит весь путь и печатает эту строку print(f"Введите '{disconnect_message}', чтобы отключиться!" ), но иногда это не так, я думаю, что он ожидает получения сообщения об отключении в предыдущей строке. В других случаях он даже этого не делает, а останавливается и ждет проверки username_is_valid или проверки Chatroom_is_valid...
Я думаю, что может быть условие гонки, которое мне не хватает...
Очевидно, что я создал проблему, но я просто не могу ее найти...
Вот весь код
На случай, если я что-то пропустил
https://codeshare.io/VNyAWP
Подробнее здесь: https://stackoverflow.com/questions/790 ... n-each-run