Система входа на сервер Python socket не работает - PullRequest
0 голосов
/ 03 декабря 2018

Я кодирую сервер сокетов Python, чтобы при подключении вы входили в систему с именем пользователя и паролем, разделенными знаком «:», когда вы говорите что-либо на подключенном сервере, оно отправляет сообщение всем остальным, используя функцию «Broadcast ()»

Но когда я пытаюсь войти в систему, он не говорит «Добро пожаловать», что и должно быть.Он просто ничего не делает, он не может войти в систему.

Я использую PuTTY для подключения к нему.

Код:

import socket
import threading
from thread import start_new_thread

connect = ""
conport = 8080

clients = []

def client_thread(conn):
    fd = open("login.txt", "r")

    def username(conn, prefix="Username: "):
        conn.send(prefix)
        return conn.recv(2048)

    def password(conn, prefix="Password: "):
        conn.send(prefix)
        return conn.recv(2048)

    username = username(conn)
    password = password(conn)

    for line in fd:
        line = line.strip()
        if line.split(":")[0] in username and line.split(":")[1] in password:
            while True:
                conn.send("Welcome")
                message = conn.recv(2048)

                print(message)

                if message:
                    broadcast(message, conn)
                else:
                    remove(conn)

                if not message:
                    break

def start_client():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((connect, conport))
    sock.listen(1)
    while True:
        conn, addr = sock.accept()
        clients.append(conn)

        start_new_thread(client_thread, (conn,))

    sock.close()

def broadcast(message, connection):
    for machine in clients:
        if machine != connection:
            try:
                machine.sendall(message)
            except:
                machine.close()
                remove(machine)

def remove(connection):
    if connection in clients:
        clients.remove(connection)

threading.Thread(target=start_client).start()

Ожидаемый результат:

Username: Admin
Password: 1234
Welcome

Фактический результат:

Username: Admin
Password: 1234

login.txt

Admin:1234
Nimda:4321

Не могли бы вы мне помочь?Он не будет правильно входить в систему: c

1 Ответ

0 голосов
/ 03 декабря 2018

В вашем коде много проблем.

Вы скрываете локальные функции username и password с переменными с одинаковыми именами.

Вы не закрываете fd (учтитеиспользуя оператор with)

Ваша логика выглядит так, как будто первое, что должен увидеть клиент, это Username:, а не Welcome.

Скорее всего, вы путаете str и bytes вВаш код.

Следующий код работает на Python3 , но все еще крайне ошибочен:

import socket
import threading
from _thread import start_new_thread

connect = ""
conport = 8080

clients = []


def receive(conn, prefix):
    conn.send(prefix)
    data = b''

    while b'\n' not in data:
        portion = conn.recv(1024)
        if portion:
            data += portion

    return data.decode('utf-8').strip()


def client_thread(conn):
    with open("login.txt", "r") as fd:
        username = receive(conn, b'Username: ')
        password = receive(conn, b'Password: ')

        for line in fd:
            u, p = line.strip().split(':')
            if u == username and p == password:
                while True:
                    conn.send(b'Welcome')
                    message = conn.recv(2048)
                    if message:
                        broadcast(message, conn)
                    else:
                        remove(conn)
                    if not message:
                        break


def start_client():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((connect, conport))
    sock.listen(1)
    try:
        while True:
            conn, addr = sock.accept()
            clients.append(conn)
            start_new_thread(client_thread, (conn,))
    finally:
        sock.close()


def broadcast(message, connection):
    for machine in clients:
        if machine != connection:
            try:
                machine.sendall(message)
            except:
                machine.close()
                remove(machine)


def remove(connection):
    if connection in clients:
        clients.remove(connection)

threading.Thread(target=start_client).start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...