Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
03.04.2009, 12:59
CPoly



Hi Leute,
Ich stehe etwas unter Zeitdruck. Wir haben ein Java-Applet zum Hochladen von Bildern geschrieben. Empfangen werden die Bilder von einem .net Webservice per SOAP-Request. Das Problem ist, dass das versenden der Bildinformationen als base64 string extrem lange dauert (40kb Bild brauchen zwischen 5 und 10 Sekunden). Die relevanten Zeilen sehen vereinfacht folgendermaßen aus.

Quellcode:BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
string bild = base64.encode(bytes);
out.write(bild);//dauert zu lange
out.flush;
Es werden natürlich noch anderen Sachen in den Stream geschrieben (der Kopf der Anfrage und der Rest des Bodys).
Ich habe auch versucht die Bildinformationen in mehrere Zeilen zu teilen, damit nicht alles auf einmal geschrieben wird, aber die obigen Zeilen dauern trotzdem insgesamt mehrere Sekunden.

Außerdem habe ich auch Alternativen zum BufferedWriter probiert, unter anderem PrintWriter, was das ganze aber eher verschlimmert hat (bis zu 30 Sekunden).

Ich hoffe jemand hier kann mich in die richtige Richtung lotzen.

Gruß

--


Dieser Beitrag wurde am 03.04.2009 um 13:01 von CPoly bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
03.04.2009, 17:49
Hanfling



Probier mal anstatt string StringBuffer zu benutzen, vllt. hilfts ja. Ich denke mal das Umformatieren wird den langsam machen. Probier vllt. auch mal "UTF8" -> "C". Oder halt was base64.encode(bytes) ausspuckt, direkt binär zu speichern und zu senden, anstatt das versuchen als String zu versenden. Evtl. über nen StringBuffer erstmal in nen Array umwandeln, und den probieren zu verschicken.

/edit:
Halt auf jeden Fall von der write(string) weg.

--

Nun ist deine Zeit gekommen sprach der Tod, stolperte und brach sich das Genick. :o


Dieser Beitrag wurde am 03.04.2009 um 17:50 von Hanfling bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
08.04.2009, 17:11
CPoly



An dem Java Problem wird heute Abend weiter geforscht. Zwischenzeitlich ist in dem Zusammenhang ein weiteres Problem aufgetreten. Ich habe für selbigen soap-Webservice einen c#-client geschrieben. Als ich heute Mittag zum Testen 30 Bilder damit hochgeladen habe, war ich überrascht, dass alles reibungslos funktioniert hat. Für besagte 30 Bilder (etwa 40kb/Bild), wurden 13 Sekunden benötigt. Leider konnte ich diese Zeit kein zweites mal erreichen.
Es scheint so, als würde irgendetwas die Übertragung blockieren, denn bei weiteren Uploads kam es häufiger zu timeouts (120Sekunden eingestellt). Nach weiterem Debuggen hab ich festgestellt, dass die timeouts nicht durch die Verarbeitung der Daten (abspeichern, Datenbank) zustandekommen, sondern einfach dadurch, dass keine Daten beim Server ankommen(vielleicht auch durch eine falsche Content-Length im Header? Denn es kam auch ab und zu zu "Bad Requests", was auch zur falschen Content-Length passen würde).

Ich hoffe euch fällt dazu was passendes ein.

Gruß Alex

--

zum Seitenanfang zum Seitenende Profil || Suche
003
08.04.2009, 19:29
Deathstar



muckt der vielleicht rum, weil die files bereits vorhanden sind?

--

zum Seitenanfang zum Seitenende Profil || Suche
004
08.04.2009, 19:46
CPoly



Zitat:
Deathstar postete
muckt der vielleicht rum, weil die files bereits vorhanden sind?
Das kann ich ausschließen, da die Dateien einen Eintrag in der Datenbank bekommen und dann als "LAST_INSERT_ID()".jpg gespeichert werden.

UPDATE:
Das Hochladen von kleinen Bildern (3kb) klappt ohne Probleme. Also muss es irgendwo noch einen Konfigurationswert geben, welcher die "großen"(ab etwa 40kb) blockt. "maxRequestLength" ist von anfang an groß genug. In der web.config habe ich außerdem "requestLengthDiskThreshold" gefunden. Was so viel bedeutet wie, wenn eine Anfrage größer ist als dieser Wert, wird Sie auf der Festplatte zwischengelagert. Das verändern hat aber leider absolut nichts geändert (leider :( ). Irgendwo muss ich was übersehen...

--


Dieser Beitrag wurde am 08.04.2009 um 21:55 von CPoly bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
09.04.2009, 20:55
CPoly



Hab neue Informationen die vielleicht jemandem helfen mir zu helfen. Ich hab festgestellt, dass am Server doch Daten ankommen und zwar fast alle. Ich habe das gleiche Bild drei mal hochgeladen. Original hatte es 113919 bytes. Am Server kamen einmal 113094 und zweimal 113318 an. Ich kann die Anfrage nach ein paar Sekunden abbrechen oder warten bis zum Timeout, es kommt immer nur fast alles an. Das erklärt natürlich das timeout, da die content-length der Anfrage mehr Daten versprochen hat und der Server auf den Rest wartet. Aber wo stecken die verlorenen bytes?

--

zum Seitenanfang zum Seitenende Profil || Suche
006
10.04.2009, 10:39
CPoly



Un ein letztes update:
Kurz: Das Problem (bei beiden) waren die Netzwerkeinstellungen der Virtual Machine (mit VirtualBox) in welcher ich entwickle. Das hat drei Tage gedauert, bis es mir dann gestern Nacht um zwei Uhr wie Schuppen von den Augen gefallen ist.

--

zum Seitenanfang zum Seitenende Profil || Suche