Файловый сервер Python

#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] вместо просто данных.