Проблема с Python Socket, когда пользователь вошел в систему, а не другой - PullRequest
0 голосов
/ 09 января 2019

это код сервера в моем приложении чата:

import socket
import threading
import sqlite3

class Server:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connections = []

    def __init__(self):

        self.sock.bind(('0.0.0.0', 9000))
        self.sock.listen(5)

    def authenticate(self, c):
        while True:
            try:
                data = c.recv(1024)
            except:
                c.close()
                return 0

            if "username:_-_" in str(data, 'utf-8'):
                global username
                username = str(data, 'utf-8').replace('username:_-_', '')

                try:
                    conn = sqlite3.connect("chat_users.db")
                    curs = conn.cursor()
                    curs.execute("select Username, Password from chat_users where Username = '" + username + "'")
                    result = curs.fetchone()
                    conn.commit()
                    conn.close()
                except:
                    try:
                        curs.execute("select * from users")
                        conn.rollback()
                        conn.close()
                        return 0
                    except:
                        return 0

                if str(result) == "None":
                    c.send(bytes("notverified", 'utf-8'))
                    continue
                else:
                    c.send(bytes("verifieduser", 'utf-8'))

                    try:
                        password = c.recv(1024)
                    except:
                        c.close()
                        return 0

                    password = str(password, 'utf-8').replace('password:_-_', '')
                    # password = hashlib.sha512(bytes(password, 'utf-8')).hexdigest()

                    if password == result[1]:
                        c.send(bytes("authenticated", 'utf-8'))
                        self.connections.append(c)
                        print(username + " is connected")
                        return 1
                    else:
                        c.send(bytes("notauthenticated", 'utf-8'))
                        continue

    def handler(self, c, a):
        auth = self.authenticate(c)
        if auth == 1:
            while True:
                try:
                    data = c.recv(1024)

                    data = username + " : " + str(data, 'utf-8')

                    for connection in self.connections:
                        if connection != c:
                            connection.send(bytes(data, 'utf-8'))
                except:
                    print(username + " is disconnected")
                    self.connections.remove(c)
                    c.close()
                    break

        else:
            c.close()
            return

    def run(self):
        while True:
            c, a = self.sock.accept()
            cThread = threading.Thread(target=self.handler, args=(c, a))
            cThread.daemon = True
            cThread.start()


server = Server()
server.run()

проблема заключается в том, что при запуске приложения возникает следующая проблема (см. Прикрепленное изображение) на рисунке мы видим, что admin4 зарегистрирован, но когда другой администратор, например admin1 или admin2, отправляет сообщение, оно будет распространено как админ 4 отправил

любая помощь о том, как решить эту проблему? Есть ли какие-либо предложения изменить код и решить проблему? Заранее спасибо

1 Ответ

0 голосов
/ 09 января 2019

У вас есть одна глобальная переменная для хранения username в методе authenticate. Он всегда будет содержать имя пользователя последнего подключенного пользователя.

Удалите глобальный и измените authenticate(), чтобы вернуть username в handler(), чтобы каждый обработчик получил локальную копию имени пользователя, которого он представляет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...