Непоочередное отправление сообщений он сервера клиенту, и наоборот (socket python)

Есть код сервера и клиента, при запуске в разных IDE можно отправлять и соответственно получать сообщения только по очереди, то есть клиент-сервер-клиент-сервер и так далее. Хочется сделать чат, где можно отправлять сообщения в любое время без очереди, пробовал асинхронное программирование, не получилось. Помогите пожалуйста. Код сервера и клиента соответственно ниже:

import socket
import time

running = True

def receive_data():
    data_rcv = conn.recv(1024).decode('utf-8')
    if data_rcv == "Client closed connection":
        print("Клиент разорвал соединие...")
        conn.close()
        return 1
    elif not data_rcv:
        return 1
    else:
        return f"Клиент: {data_rcv}"

def send_data():
    data_snd = input("Вы: ")
    if data_snd == "конец":
        conn.send("Server closed connection".encode('utf-8'))
        conn.close()
        return 1
    else:
        return data_snd.encode('utf-8')

def main():
    global running
    data_rcv = receive_data()
    if data_rcv == 1:
        running = False
        return "stop"
    else:
        print(data_rcv)
    data_snd = send_data()
    if data_snd == 1:
        running = False
        return "stop"
    else:
        conn.send(data_snd)


print("Сервер запущен")
time.sleep(0.5)
print("Поиск соединения...")

srv = socket.socket()
srv.bind(('', 9090))
srv.listen(1)
conn, addr = srv.accept()

print('Соединение найдено!', addr)

while running:
    main()
    if not running:
        break

conn.close()

И клиент:

import socket

running = True

def send_data():
    data_snd = input("Вы: ")
    if data_snd == "конец":
        clt.send("Client closed connection".encode('utf-8'))
        clt.close()
        return 1
    else:
        return data_snd.encode('utf-8')

def receive_data():
    data_rcv = clt.recv(1024).decode('utf-8')
    if data_rcv == "Server closed connection":
        print("Сервер разрвал соединение...")
        clt.close()
        return 1
    elif not data_rcv:
        return 1
    else:
        return f"Сервер: {data_rcv}"

def main():
    global running
    data_snd = send_data()
    if data_snd == 1:
        running = False
        return "stop"
    else:
        clt.send(data_snd)
    data_rcv = receive_data()
    if data_rcv == 1:
        running = False
        return "stop"
    else:
        print(data_rcv)


clt = socket.socket()
clt.connect(('localhost', 9090))


while running:
    main()
    if not running:
        break

clt.close()

Заранее спасибо!


Ответы (0 шт):