#python
#питон
Вопрос:
Я следовал руководству, чтобы сделать это, и я пытаюсь добавить ls
команду, чтобы вы могли видеть файлы для загрузки. Код работает, и все отпечатки возвращают правильные данные, но клиент показывает только шесть букв одного из файлов. Сервер:
import socket
import threading
import os
def RetrFile(name, sock):
filename = sock.recv(1024)
if filename != "ls":
if os.path.isfile(filename):
sock.send("EXISTS " str(os.path.getsize(filename)))
userResponse = sock.recv(1024)
if userResponse[:2] == 'OK':
with open(filename, 'rb') as f:
bytesToSend = f.read(1024)
sock.send(bytesToSend)
while bytesToSend != "":
bytesToSend = f.read(1024)
sock.send(bytesToSend)
else:
sock.send("ERR ")
sock.close()
else:
dir_path = os.path.dirname(os.path.realpath(__file__))
retval = os.listdir(dir_path)
print retval
for ret in retval:
print ret
sock.send(ret)
def Main():
host = '192.168.0.125'
port = 5000
s = socket.socket()
s.bind((host,port))
s.listen(5)
print "Server Started."
while True:
c, addr = s.accept()
print "client connedted ip:<" str(addr) ">"
t = threading.Thread(target=RetrFile, args=("RetrThread", c))
t.start()
s.close()
if __name__ == '__main__':
Main()
Каталог с файлом Python (файлы для загрузки): каталог
Server Output: "client connedted ip:<('192.168.0.112', 49546)>
['runmeee.exe', 'Untitled.png', 'putty.exe', 'pyserver.py']
runmeee.exe
Untitled.png
putty.exe
pyserver.py"
Client output: runmee
Комментарии:
1. Я вижу, что сервер печатает запуск, я вижу, что клиент печатает результат
os.listdir
и следующий цикл, но я не понимаю, кто отправляет команды? И кто печатает последнийrunmee
(глючный)?2. Я исправил 6-символьную вещь, которая была из-за клиента. Но теперь мне просто нужно объединить сервер в одну часть данных, потому что клиент ожидает только одного
3. в этом случае просто сделайте
sock.send("n".join(retval))
вместо вашего цикла. Вы будете отправлять по 1 файлу на строку в одном текстовом блоке. Хромая сериализация, но работает. Или отправьтеstr(retval)
и используйтеast.literal_eval
для десериализации его в список на другом конце.4. Исправлено! Я просто объединил данные в одну строку и обнаружил, что клиент печатает данные [: 6] вместо просто данных.