я пытаюсь навсегда запустить серверный скрипт на сервере и позволить клиенту присоединиться и отправить папку с изображениями, которую я сейчас тестирую с одним клиентом, который работает, но со многими проблемами, скажем, он закрывает соединение, если все операции передачи выполняются, он должен оставаться подключенным новые изображения будут добавляться в папку клиента, которые нужно переносить снова и снова, поэтому сервер и клиент должны работать вечно. Может ли кто-нибудь исправить код.
сервер
import socket
import sys
import threading
import time
from queue import Queue
import os.path
save_path = './rcv'
serversock = socket.socket()
host = '0.0.0.0'
port = 81
print(host)
serversock.bind((host,port))
filename = ""
serversock.listen(10)
print("Waiting for a connection.....")
clientsocket,addr = serversock.accept()
print("Got a connection from %s" % str(addr))
while True:
size = clientsocket.recv(16) # Note that you limit your filename length to 255 bytes.
if not size:
break
size = int(size, 2)
filename = clientsocket.recv(size)
filesize = clientsocket.recv(32)
filesize = int(filesize, 2)
path = os.path.join(save_path.encode(), filename)
file_to_write = open(path, 'wb')
chunksize = 4096
while filesize > 0:
if filesize < chunksize:
chunksize = filesize
data = clientsocket.recv(chunksize)
file_to_write.write(data)
filesize -= len(data)
file_to_write.close()
print('File received successfully')
клиент
import socket
import os
import threading
import time
s = socket.socket()
#host = socket.gethostname()
host = '0.0.0.0'#dest ip
port = 81
path = "./data"
directory = os.listdir(path)
s.connect((host, port))
while True:
if not os.listdir(path):
print("Directory is empty")
time.sleep(3)
else:
#s.connect((host, port))
for files in directory:
print(files)
filename = files
size = len(filename)
size = bin(size)[2:].zfill(16) # encode filename size as 16 bit binary
s.send(size.encode())
s.send(filename.encode())
filename = os.path.join(path,filename)
filesize = os.path.getsize(filename)
filesize = bin(filesize)[2:].zfill(32) # encode filesize as 32 bit binary
s.send(filesize.encode())
file_to_send = open(filename, 'rb')
l = file_to_send.read()
s.send(l)
file_to_send.close()
print ('File Sent')
if os.path.exists(filename):
os.remove(filename)
time.sleep(1) # without sleep its not transfering more then 30 images
else:
print("The file does not exist")