2016-10-10 7 views
0

Ich versuche, ein TCP (Client und Server) in Python zu machen, um eine Datei herunterzuladen, die auf dem Server verfügbar ist. Ich bin ein absoluter Anfänger im Netzwerk in Python und folge einem Tutorial für diesen Zweck. Das Problem, das ich bin immer ist, dass, wenn ich versuche, eine Datei vom Server zum Download ich diesen Fehler:Herunterladen einer Datei mit 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

Sie können den "pre while" -Block von "data = ...", "totalRecv = ..." und "f.write ..." entfernen, da Sie diese Logik bereits im while-Block selbst handhaben. Initialisiere einfach den totalRecv zu 0 – MikeL

Antwort

0

Sie müssen bytes an die Steckdose senden, nicht eine string. Sie können einen String in einen Bytes mit .encode() Try konvertieren:

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

Als Randbemerkung, die Sie nicht brauchen, wenn Semikolons mit Python, also würde ich empfehlen, sie aus dem Code zu entfernen.

+0

Danke! Das hat funktioniert! Auch ich wollte fragen, können wir Python-Listen auf die gleiche Weise senden? Wie mache ich eine Liste auf der Serverseite und sende sie an die Client-Seite? –

+1

Der einzige Datentyp, den Sie über einen Socket senden können, ist "Bytes", also müssten Sie die Liste irgendwie kodieren - vielleicht in JSON. – csinchok