Python. Программа не выходит из бесконечного цикла при записи файла с сервера socket

Всем привет! Делаю программу для получения файлов с сервера. Сделал основу, но клиент не выходит из бесконечного цикла при записи данных в файл с сервера. Вот код сервера:

import threading
from socket import socket, AF_INET, SOCK_STREAM

def accept_incoming_connections():
    while True:
        client, client_address = sock.accept()
        print("%s:%s соединено" % client_address)
        #client.send(bytes("Добро пожаловать , введите своё имя и нажмите Enter", "utf8"))
        addresses[client] = client_address
        threading.Thread(target=handle_client, args=(client,)).start()

def handle_client(client):
    while True:
        try:
            msg = client.recv(1024)
            print(msg)
            if msg == b'quit':
                del addresses[client]
                break
            if msg == b'getfile':
                print("opening")
                fl = open("audiosservers/bunker.mp3",'rb')#, encoding="utf-8")
                data = fl.read(1024)
                while data:
                    if not data:
                        fl.close()
                        break
                    else:
                        client.send(data)#.encode("utf-8"))
                        data = fl.read(1024)
                fl.close()
                print("done")
        except Exception as e:
            print(e)
            del addresses[client]
            break

host, port = "localhost", 5555
addr=(host,port)
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(addr)
addresses = {}
maxclients=5
if __name__ == "__main__":
    sock.listen(maxclients)
    print("ожидание соединения")
    at = threading.Thread(target=accept_incoming_connections)
    at.start()
    at.join()
    sock.close()

Вот код клиента:

import socket
import threading

def send():
    while True:
        msg = input()
        sock.send(f'{msg}'.encode("utf-8"))
        if msg == "getfile":
            receivefile()

def get():
    while True:
        msg = sock.recv(1024)
        print(msg)

def receivefile():
    data = sock.recv(1024)
    fl = open("audiosclients/audio1.mp3", 'wb')
    #print
    while data:
        if not data:
            print("done")
            fl.close()
            break
        else:
            fl.write(data)
            data = sock.recv(1024)
    #fl.close()
    print("done")


host,port = "localhost", 5555
addr = (host,port)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(addr)
#sock.setblocking(False)
th1 = threading.Thread(target=send).start()
th2 = threading.Thread(target=get).start()

Я думаю что ошибка находиться в sock.recv(1024) в клиенте Но не знаю как её исправить.


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

Автор решения: Dezmonder

Так у вас и нет выхода из бесконечного цикла. Не знаком конкретно с этой библиотекой, но вы можете поставить не while True, а конструкцию, которая может когда-то вернуть False. Например использовать флаг с состоянем

→ Ссылка