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