Код: Выделить всё
class Client(server_client_data.Connection):
def __init__(self, host: str, port: int):
super().__init__(host, port, "Client", None)
self.socket.connect((host, port))
self.socket = socketH(self.socket)
self.logged_in = False
self.socket.underlying_socket.setblocking(False)
self.lock = threading.Lock()
self.expecting_data = False
@staticmethod
def client_method(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
with self.lock:
self.expecting_data = True
self.socket.underlying_socket.setblocking(True)
try:
result = func(self, *args, **kwargs)
finally:
self.expecting_data = False
self.socket.underlying_socket.setblocking(False)
return result
return wrapper
@client_method
def login(self, email: str, password: str):
# writing command
self.socket.write_string(server_client_data.SERVER_COMMANDS.login.value)
self.read_exception()
self.socket.write_string(email)
self.socket.write_string(password)
self.read_exception()
username = self.socket.read_string()
user_code = self.socket.read_string()
self.logged_in = True
return username, user_code
@client_method
def log_out(self):
# writing command
self.socket.write_string(server_client_data.SERVER_COMMANDS.logout.value)
self.read_exception()
self.logged_in = False
@client_method
def sign_up(self, email: str, password: str, username: str):
# writing command
self.socket.write_string(server_client_data.SERVER_COMMANDS.sign_up.value)
self.read_exception()
self.socket.write_string(email)
self.socket.write_string(username)
self.socket.write_string(password)
self.read_exception()
@client_method
def send_message(self, message: str, username: str, user_code: str):
# writing command
self.socket.write_string(server_client_data.SERVER_COMMANDS.send_message.value)
self.read_exception()
# check if logged
self.read_exception()
self.logged_in = True
self.socket.write_bool(False)
self.socket.write_string(username)
self.socket.write_string(user_code)
self.read_exception()
# write name/title
self.socket.write_string("empty test")
# write file validation
self.socket.write_bool(False)
# write message
self.socket.write_string(message)
# check if sending or creating the message was a successes
self.read_exception()
# returns message id
return self.socket.read_string()
def start_listener(self):
stop_event = threading.Event()
thread = threading.Thread(target=self.listener_loop, args=(stop_event,))
self.threads[stop_event] = thread
thread.start()
def listener_loop(self, stop_event):
while not stop_event.is_set():
with self.lock:
if not self.expecting_data:
try:
client_command = self.socket.read_string()
if client_command:
print(
f"Client {self.socket.underlying_socket.getpeername()} initiated the {client_command} command"
)
except BlockingIOError:
continue
except Exception as e:
print(f"Listener loop encountered an error: {e}")
break
def read_exception(self):
code = self.socket.read_byte()
if code < 0:
raise ValueError(self.socket.read_string())
есть какие-нибудь советы?
пример исправленной или рабочей версии моего кода
Подробнее здесь: https://stackoverflow.com/questions/790 ... -functions