2016-10-10 4 views
0

Я пытаюсь сделать TCP (клиент и сервер) в python для загрузки файла, доступного на сервере. Я являюсь новичком в области сетевого взаимодействия на Python и следую инструкциям для этой цели. Проблема я получаю то, что всякий раз, когда я пытаюсь загрузить файл с сервера, я получаю эту ошибку:Загрузка файла с использованием TCP (Client/Server)?

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner 
    self.run() 
    File "/usr/lib/python3.4/threading.py", line 868, in run 
    self._target(*self._args, **self._kwargs) 
    File "fileServer.py", line 8, in RetrFile 
    sock.send("EXISTS " + str(os.path.getsize(filename))); 
TypeError: 'str' does not support the buffer interface 

FileServer.py

import socket; 
import threading; 
import os; 

def RetrFile(name,sock): 
    filename = sock.recv(1024).decode(); 
    if os.path.isfile(filename): 
     sock.send("EXISTS " + str(os.path.getsize(filename))); 
     userResponse = sock.recv(1024).decode(); 
     if (userResponse[:2] == 'OK'): 
      with open(filename,'rb') as f: 
       bytesToSend = f.read(1024); 
       sock.send(bytesToSend); 
       while (bytesToSend != ""): 
        byteToSend = f.read(1024); 
        sock.send(bytesToSend); 
    else: 
     sock.send("ERR"); 
    sock.close(); 

def Main(): 
    host = "127.0.0.1"; 
    port = 5003; 

    s = socket.socket(); 
    s.bind((host,port)); 

    s.listen(5); 

    print("Server Started.") 

    while True: 
     c , addr = s.accept(); 
     print("Client connected ip : " + str(addr)); 
     t = threading.Thread(target = RetrFile,args=("retrThread",c)) 
     t.start(); 
    s.close(); 

if __name__ == '__main__': 
    Main(); 

FileClient.py

import socket 

def Main(): 
    host = "127.0.0.1"; 
    port = 5003; 

    s = socket.socket(); 
    s.connect((host,port)); 

    filename = input("Filename? -> "); 
    if (filename != "q"): 
     s.send(filename.encode()) 
     data = s.recv(1024) 
     if (data[:6] == "EXISTS"): 
      filesize = long(data[6:]) 
      message = input("File Exists, " + str(fielsize) + "Bytes, download? (Y/N)? -> "); 
      if (message == "Y"): 
       s.send("OK") 
       f = open('new_'+filename,'wb') 
       data = s.recv(1024) 
       totalRecv = len(data) 
       f.write(data) 
       while(totalRecv < filesize): 
        data = s.recv(1024); 
        totalRecv += len(data) 
        f.write(data) 
        print("{0:.2f}".format((totalRecv/float(filesize))*100 + "%Done")); 
       print("Download Complete!"); 

     else: 
      print("File does not exist!"); 
    s.close(); 

if __name__ == '__main__': 
    Main(); 
+0

Вы можете удалить блок «pre while» «data = ...», «totalRecv = ...» и «f.write ...», поскольку вы уже обрабатываете эту логику в самом блоке while. Просто инициализируйте totalRecv до 0 – MikeL

ответ

0

Вы необходимо отправить bytes в розетку, а не string. Вы можете преобразовать строку в байты с .encode() Try:

message = "EXISTS " + str(os.path.getsize(filename))) 
sock.send(message.encode()) 

Как примечание стороны, вам не нужны запятая при использовании Python, так что я бы рекомендовал удалить их из вашего кода.

+0

Спасибо! Это сработало! Также я хотел спросить, можем ли мы отправлять списки python одинаково? Как сделать список на стороне сервера и отправить его на клиентскую сторону? –

+1

Единственным типом данных, который вы можете отправить через сокет, является 'bytes', поэтому вам нужно каким-то образом закодировать список - возможно, в JSON. – csinchok