2016-05-06 8 views
0

Hallo Ich habe einen Client und eine Server-Architektur mit Sockets in Python zum Übertragen von Dateien gemacht. Es funktioniert einwandfrei in Windows, aber in Ubuntu funktioniert es nicht. In Ubuntu gibt es keinen Fehler, aber die ganze Datei wird nicht gesendet. Wenn ich versuche, eine Musikdatei von 4MB zu senden, werden nur 50-60kB übertragen, während in Windows sogar eine Datei von 300MB perfekt gesendet wird. Hier ist mein Code.Dateiübertragung in Python mit Socket

Mandanten-

def sendFile(self): 
    # ''' Print a language constructed from 
    #  the selections made by the user. ''' 
    # print('%s!' % (self.recipient.displayText())) 
    client_socket.send("upload") 
    time.sleep(1) 
    client_socket.send(self.virtual_os[self.os_box.currentIndex()].title()) 
    time.sleep(1) 
    path = self.recipient.displayText() #inputbox which contains the path of the file 
    self.recipient.setText('') 
    name = path.split('/') 
    name = name[len(name)-1] 
    print "Opening file - ",name 
    client_socket.send(name) 
    time.sleep(1) 
    fp = open(path,'rb') 
    data = fp.read() 
    fp.close() 
    size = os.path.getsize(path) 
    size = str(size) 
    client_socket.send(size) 
    time.sleep(1) 
    client_socket.send(data) 
    print "Data sent successfully" 

Server-

choice = client_socket.recv(1024) 
if(choice == "upload"): 
    virtual_os = client_socket.recv(1024) 
    print virtual_os 
    fname = client_socket.recv(1024) 
    print "recieved file "+fname 
    size = client_socket.recv(1024) 
    size = int(size) 
    print "The file size is - ",size," bytes" 
    size = size*2 
    strng = client_socket.recv(size) 
    fp = open(fname,'wb') 
    fp.write(strng) 
    fp.close() 
    print "Data Received successfully" 

Gibt es ein Problem mit meinem Code oder habe ich etwas zu ändern, es auf Ubuntu funktioniert?

+0

Warum Sie nicht nur 'len (Daten) verwenden' statt 'os.path.getsize()'? –

+0

os.path.getsize() funktioniert gut, weil ich die Größe drucke und es druckt die richtige Größe, aber ich versuchte mit len ​​(Daten) auch noch nicht funktioniert. Und das Problem ist nur in Ubuntu. Irgendwie wird nur ein Teil der Daten gesendet. –

Antwort

0

Manchmal werden die Daten in kleinere Teile zerlegt und über die Netzwerkschnittstelle in mehreren Segmenten anstatt auf einmal gesendet. Grundsätzlich erhalten Sie nicht die gesamte Nachricht, bevor Sie die Netzwerkverbindung schließen. Sie müssen etwas hinzufügen, das prüft, ob Daten empfangen wurden (z. B. eine while-Schleife, um zu prüfen, ob die Datengröße 0 ist). Ich habe nach dem von einem der Beispiele aus der offiziellen Python Seite https://docs.python.org/2/library/socket.html#example

# Echo server program 
import socket 

HOST = '' 
PORT = 50007 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print 'Connected by', addr 
while 1: 
    data = conn.recv(1024) 
    if not data: break 
    conn.sendall(data) 
conn.close() 
+0

Ich habe das auch probiert! Mein Hauptanliegen ist, wenn der gleiche Code an Windows arbeitet, warum funktioniert es nicht auf Ubuntu? –

+0

Haben Sie die Loopback-Schnittstelle (dh '' localhost'' oder '' 127.0.0.1'') in Ihren Tests verwendet? Es gibt einige Komplikationen beim Senden über den Loopback, z. B. "Expandieren" des Puffers, um die Daten aufzunehmen (zitieren Sie mich dabei nicht). In jedem Fall sollten Sie wireshark oder tcpdump verwenden, um zu sehen, was passiert. FYI wireshark funktioniert nicht mit localhost unter Windows. –