Python "==" возвращает False, когда он должен возвращать True

Недавно я экспериментировал с защитой паролем сокетов в python и столкнулся с проблемой.

При проверке ввода клиентов с установленным сервером паролем сервер, похоже, считает, что установленный пароль не совпадает с паролем, введенным пользователем.

Мой первый скрипт: server.py

import socket
import threading
from requests import get
import uuid
HEADER = 64
PORT = 9090
#To connect over the internet change SERVER to your public IP
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)

def handle_client(conn, addr, password):
    print(f"[PNet] NEW CONNECTION: {addr} connected.")

    connected = True
    while connected:
        msg_length = conn.recv(HEADER).decode(FORMAT)
        if msg_length:
            msg_length = int(msg_length)
            msg = conn.recv(msg_length).decode(FORMAT)
            print(msg)
            if msg == password:
                connected = True
            if msg != password:
                print("Huh?")
            if msg == DISCONNECT_MESSAGE:
                connected = False
            print(f"[PNet] {addr}: {msg}")
            conn.send("[PNet] CLIENT: Message received.".encode(FORMAT))
    conn.close()
    
def start():
    print("[PNet] STARTING: Server is starting...")
    print("[PNet] STARTING: Generating key...")
    password = uuid.uuid4()
    print(f"[PNet] FINALIZING: Key generated: {password}")
    server.listen()
    print(f"[PNet] LISTENING: Server is listening on {SERVER}.")
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr, password))
        thread.start()
        #print(f"[PNet] ACTIVE CONNECTIONS: {threading.activeCount() - 1}")
        
start()

и мой второй скрипт: client.py

import socket

HEADER = 64
PORT = 9090
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
SERVER = input("[PNet] CLIENT: Server IP: ")
PASS = input("[PNet] SERVER: Enter password: ")
ADDR = (SERVER, PORT)

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)

def send(msg):
    message = msg.encode(FORMAT)
    msg_length = len(message)
    send_length = str(msg_length).encode(FORMAT)
    send_length += b' ' * (HEADER - len(send_length))
    client.send(send_length)
    client.send(message)
    print(client.recv(2048).decode(FORMAT))

send(PASS)

connected = True
while connected:
    msg = input("[PNet] CLIENT: Send a message: ")
    if msg != DISCONNECT_MESSAGE:
        send(msg)
    else:
        send(msg)
        connected = False

при запуске и копировании пароля точно с терминала все равно возвращает False. Спасибо за вашу помощь :)

Имейте в виду, что socket.recv(n) не гарантирует возврат n байт. Возможно, вам придется повторно читать, пока вы не получите достаточно.

donkopotamus 24.12.2020 07:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
191
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы сопоставляете объект UUID со строкой, поэтому он возвращает false,

проверить, поставить отпечаток перед сравнением,

...
print(type(msg),type(password)) # will print <class 'str'> <class 'uuid.UUID'>

if msg == password:
    connected = True
...

чтобы решить эту проблему, передайте пароль в виде строки,

password = str(uuid.uuid4())

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