Python TCP-сервер / клиент для передачи файлов - PullRequest
0 голосов
/ 09 июля 2020

Я пытался создать TCP-сервер / клиент для передачи файлов между ними. На данный момент мой код выглядит так (он беспорядочный). При отправке команды GET я хочу получить файл с сервера, который работает, но только если я ^ C закрываю клиент (файл создается, но в нем ничего не записывается, пока я не закрою клиент). Когда я отправляю команду SEND для получения файла с сервера (машины, на которой запущен сервер), она работает, но только потому, что после этого я выключил сокет. Я хочу, чтобы сокет оставался подключенным после отправки файла.

Вот код, который для этого используется:

server.py

            elif msg[:4] == 'file':
                client_command = msg[5:9]

                if client_command == 'GET ':
                    file_name = msg[9:]

                    f = open(file_name, "rb")
                    l = f.read(self.BUFF_SIZE)

                    while(l):
                        self.send_info(l)
                        l = f.read(self.BUFF_SIZE)

                    f.close()

                elif client_command == 'SEND':
                    file_name = msg[10:]

                    f = open(file_name, "wb")
                    l = self.recv_info()

                    while(l):
                        f.write(l)
                        l = self.recv_info()

                    f.close()

def send_info(self, msg):
        info = bytes(msg)
        send = self.client_socket.sendall(info)

        return send

def recv_info(self):
        recv = self.client_socket.recv(self.BUFF_SIZE)

        return recv

client.py

    answer = input()

    elif answer[:4] == 'file':
        s.send(answer.encode('iso-8859-1'))

        command = answer[5:9]

        if command == 'GET ': 
            fileName = answer[9:]

            f = open(fileName, 'wb')
            l = s.recv(2048)

            while(l):
                f.write(l)
                l = s.recv(2048)
                
            f.close()

        elif command == 'SEND':
            fileName = answer[10:]

            f = open(fileName, 'rb')
            l = f.read(2048)

            while (l):
                s.send(l)
                l = f.read(2048)
            
            f.close()
            s.shutdown(socket.SHUT_WR)

Я изменю способ обработки имени файла и откажусь от нарезки, как только буду уверен, что передача работает.

Я, наверное, просто не понимаю, как перевод должен быть выполнен, но если кто-нибудь может исправить мой код или объяснить, как он должен быть, чтобы он работал. Я просто хочу иметь возможность отправлять и передавать файлы без закрытия сокета (выключения), чтобы мне не приходилось повторно подключать клиента после каждой команды и без необходимости закрывать клиент для завершения sh передачи файла. Если нужно, я могу добавить больше кода. Спасибо за любую помощь.

1 Ответ

0 голосов
/ 09 июля 2020

Проблема может быть в буферизации файла. Если вы хотите, чтобы файл был записан сразу после получения, вы можете использовать метод flush:

f = open(fileName, 'wb')
l = s.recv(2048)

while(l):
  f.write(l)
  l = s.recv(2048)
f.flush()                
f.close()

Примечание: я настоятельно рекомендую использовать with оператор, чтобы файл всегда был закрыт:

with open(filename, 'wb') as f:
  l = s.recv(2048)
  while(l):
    f.write(l)
    l = s.recv(2048)
  f.flush()            
...