Добрый день.
У меня следующая проблема:
Я внедряю систему клиент-сервер, которая позволяет отправлять сообщения и файлы, когда клиент отправляет файлы сообщений, которые сервер отправит Папка img с ее файлами.
Проблема возникает из-за того, что файлы fini sh, поступающие на клиент, не могут отправить новое сообщение на сервер, поскольку появляется следующая ошибка:
> hi
> hello
> files
Receiving folder img
Receiving Captura.PNG size 52120
Receiving Captura2.PNG size 140060
Receiving Thumbs.db size 36864
> new
Traceback (most recent call last):
File "C: \ Users \ Dell \ Desktop \ client.py", line 9, in <module>
client.sendall (msg.encode ())
OSError: [WinError 10038] An attempt was made to perform an operation on an element that is not a socket
Я ожидал, что как только передача файла будет завершена, они продолжат посылать сообщения друг другу, и что только если клиент отправил сообщение о выходе, сервер завершит
CLient
import socket
import os
client = socket.socket()
client.connect(('192.168.8.4',5555))
while True:
msg = input("> ")
client.sendall(msg.encode())
if msg == "files":
with client,client.makefile('rb') as newfile:
Folder = newfile.readline()
if not Folder:
break
Folder = Folder.strip().decode()
NoFiles = int(newfile.readline())
print("Receiving folder {}".format(Folder))
os.makedirs(Folder,exist_ok=True)
for file in range(NoFiles):
filename = newfile.readline().strip().decode()
filesize = int(newfile.readline())
data = newfile.read(filesize)
print("Receiving {} size {}".format(filename,filesize))
with open(os.path.join(Folder,filename),"wb") as f:
f.write(data)
Сервер
import socket
import os
server = socket.socket()
server.bind(("192.168.8.4",5555))
server.listen(2)
FolderName = "img"
Path = "C:\\Users\\AngelHp\\Desktop\\img"
while True:
client,address = server.accept()
while True:
msg = client.recv(1024).decode()
print(msg)
if msg == "files":
print("Sending {}".format(FolderName))
client.sendall(FolderName.encode()+b'\n')
Files = os.listdir(Path)
client.sendall(str(len(Files)).encode()+b'\n')
for File in Files:
pathfile = os.path.join(Path,File)
filesize = os.path.getsize(pathfile)
print("Sending {} size {}".format(pathfile,filesize))
client.sendall(File.encode()+b'\n')
client.sendall(str(filesize).encode()+b'\n')
with open(pathfile,'rb') as f:
client.sendall(f.read())
elif msg == "exit":
break