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. Например использовать флаг с состоянем