Python Netzwerk-Programm stürzt einfach ab

  • Ersteller Ersteller Furtano
  • Erstellt am Erstellt am
F

Furtano

Gast
Netzwerk-Programm überträgt nur 1KB

Hi,

mein Programm, dass eine Datei von Server zu Client überträgt funktioniert gut.
Nur bekomme ich manchmal den Fehler (wenn ich über Eclipse aufrufe, über Konsole kommt er nicht):

File "C:\Dokumente und Einstellungen\Christian\workspace\autoupdater\client.py", line 28, in <module>
BUFFERSIZE =int(s.recv(1024))
ValueError: invalid literal for int() with base 10: '3730109PK\x03\x04\x14'

Wie ändere ich das?

Server.py
PHP:
'''
Created on 08.06.2012

@author: Christian
'''
#!/usr/bin/python

from socket import *
from binascii import *
import os

data = []

def readFile (fileName):
    x=os.stat(fileName)

    file = open(fileName, "rb")
    for b in file:
        data.append(b)
    file.close()
    
    #Anzahl der Bytes
    return x.st_size 

BUFFERSIZE = readFile("hier.zip")
print "Dateigroesse: " + str(BUFFERSIZE)
myHost = ''
myPort = 2000

s = socket (AF_INET, SOCK_STREAM)
s.bind ((myHost, myPort))
s.listen (22) # 22 Leute gleichzeitig



# wandelt die liste der daten in einen String um
string = ''.join(data)



try:
    while 1:
        connection, adress = s.accept()
        connection.sendall(str(BUFFERSIZE))
        connection.sendall(string)
        
finally:
    s.close()


Client.py

PHP:
'''
Created on 08.06.2012

@author: Christian
'''
#!/usr/bin/python

import sys
import os
from socket import *

data = []

def writeFile (fileName):
    newfile = open (fileName,'wb')
    string = ''.join(data)
    newfile.write(string)
    newfile.close()
    
serverHost = 'localhost'
serverPort = 2000

s = socket (AF_INET, SOCK_STREAM)

s.connect((serverHost, serverPort))
#s.send(os.environ['COMPUTERNAME'])

BUFFERSIZE =int(s.recv(1024))

try:
        data = s.recv(3730109) 
        #for i in data:
           #print i  
finally:
    s.close()
writeFile('download.zip');
print 'Uebertragung abgeschlossen'
s.close()
print 'Verbindung geschlossen'
#print 'Dateigroesse: ' + BUFFERSIZE
 
Zuletzt bearbeitet von einem Moderator:
Kann es sein, dass die zu übertragende Datei mit der Byte-Sequenz PK\x03\x04\x14 beginnt? Das es in Eclipse funktioniert könnte mit unterschiedlichen Zeitverhalten zu tun haben.
 
"PK" ist der Anfang der ZIP-Datei, die du versenden willst. Dein Client bekommt also die Größe der Datei (der gewählte Name BUFFERSIZE ist hier etwas verwirrend) und schon den Anfang der ZIP-Datei vom Server. Das lässt sich natürlich nicht in eine Zahl konvertieren.

Ein Ansatz wäre (sofern Python das unterstützt) einen echten Buffer zu nehmen und so lange vom Server Daten empfangen, bis nichts mehr kommt, also die Datei komplett ist. Dann entfällt auch das Senden der Dateigröße am Anfang.
 
Die einfachste Möglichkeit wäre eine Stringkonkatenation, d.h. du fügst immer häppchenweise die vom Server empfangenen Daten an deinen Buffer an, bis nichts mehr vom Server kommt.
Bei größeren Datenmengen könnte die Performance dadurch leiden, je nachdem, wie Strings in Python implementiert sind.
 
Eine andere Möglichkeit wäre es Blöcke mit den Aufbau 'Größe Leerzeichen Daten' zu verschicken. Hätte den Vorteil, dass die Frage wann denn nichts mehr von Server kommt, sich nicht stellt.
 
Zurück
Oben