Python - отправка файлов через сокеты - PullRequest
3 голосов
/ 22 февраля 2012

Я пытался реализовать небольшое приложение SERVER - CLIENT, но столкнулся с ошибкой:

socket.error: [Errno 10057] Запрос на отправку или получение данных был отклонен, посколькусокет не подключен и (при отправке на дейтаграмму сокета с помощью вызова sendto) адрес не был предоставлен

Сервер:

class Server:
    gate = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = socket.gethostname()
    port = 0
    file = ''

    def __init__(self, port):
        self.port = port
        self.gate.bind((self.host, self.port))  
        self.listen()

    def listen(self):
        self.gate.listen(10)
        while True:
            add = self.gate.accept()
            self.reciveFileName()
            self.reciveFile()


    def reciveFileName(self):
        while True:
            data = self.gate.recv(1024)
            self.file = data

    def reciveFile(self):
        createFile = open("new_"+self.file, "wb")
        while True:
            data = self.gate.recv(1024)
            createFile.write(data)
        createFile.close()



a = Server(1111)

Клиент:

class Client:
    gateway = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #host = socket.gethostname()
    host = ''
    port = 0
    file = ''

    def __init__(self, host, port, file):
        self.port = port
        self.host = host
        self.file = file
        self.connect()

    def connect(self):
        self.gateway.connect((self.host, self.port))
        self.sendFileName()
        self.sendFile()

    def sendFileName(self):
        self.gateway.send("name:" + self.file)

    def sendFile(self):
        readByte = open(self.file, "rb")
        data = readByte.read()
        readByte.close()

        self.gateway.send(data)
        self.gateway.close()



a = Client('93.103.56.251', 1111, 'data.txt')

1 Ответ

7 голосов
/ 22 февраля 2012

Сервер имеет один сокет сервера, который используется для accept входящих соединений, и другой сокет для каждого из этих соединений. Из вашего кода:

self.gate.listen(10)
while True:
    add = self.gate.accept()
    self.reciveFileName() # which calls self.gate.recv()

Вместо того, чтобы работать с self.gate в reciveFilename и reciveFile (кстати, правильное написание - receive), вы должны заставить эти методы работать на принятом соединении, как это:

def listen(self):
    self.gate.listen(10)
    while True:
        conn,address = self.gate.accept()
        self.receiveFilename(conn)

def receiveFilename(self, sock):
    buf = sock.recv(1024)
    print('First bytes I got: ' + buf)

Кроме того, reciveFilename в настоящее время постоянно слушает сокет. Вместо этого вы должны разработать правильный протокол, который указывает, когда имя файла заканчивается и начинается содержимое файла. Например, вы можете позволить имени файла оканчиваться на b'\0' и позволить серверу искать этот байт.

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