Как мне создать поток прослушивателя и функции клиент-сервер в одном сокете?Python

Программы на Python
Anonymous
Как мне создать поток прослушивателя и функции клиент-сервер в одном сокете?

Сообщение Anonymous »

Код: Выделить всё

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

Вернуться в «Python»