OSError: [WinError 10038] Была предпринята попытка выполнить операцию с элементом, который не является сокетом - PullRequest
0 голосов
/ 14 января 2020

Добрый день.

У меня следующая проблема:

Я внедряю систему клиент-сервер, которая позволяет отправлять сообщения и файлы, когда клиент отправляет файлы сообщений, которые сервер отправит Папка 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

1 Ответ

0 голосов
/ 14 января 2020

Обновлено с комментария до ответа:

Основываясь на описании оператора with (https://docs.python.org/3/reference/compound_stmts.html#the -with-Statement ), я подозреваю, что, поскольку у вас client как единое целое из with-элементов сокет закрывается неявно, когда завершается блок with.

Отказ от технического жаргона из вопроса, когда объект используется в операторе with, он будет автоматически очищен вверх / закрыто / что угодно, когда заканчивается блок with. В этом случае это означало, что ссылка на сокет больше не действительна на следующей итерации l oop, что приводило к ошибке.

Поскольку, похоже, нет причины включать client в оператор with, Я бы просто удалил его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...