Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Allgemeine Java-Programmierung > Connection Reset bei Webserver, Java WebStart als Client
Antwort
 
Themen-Optionen
Alt 02.03.2008, 19:56   Nach oben    #1
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard Connection Reset bei Webserver, Java WebStart als Client

Hallo Forum,

ich möchte ein Programm mit einem kleinen Webserver ausstatten um es mit WebStart verteilen zu können.

Der Server lauscht also auf einen Port wie ein Webserver und übermittelt bei Anfrage nach der entsprechenden URL die .jnlp-Datei zum Client die dann dort von WebStart geöffnet wird.
Soweit kein Problem, wenn ich die entsprechenden Resourcen des Programms aus Firefox heraus aufrufe kann ich diese "downloaden", und die übertragenen Daten sind vollständig und korrekt. Der Webserver scheint also zu funktionieren.
Wenn nun aber WebStart die entsprechenden Anfragen stellt kommt es während der Übertragung zu einem Connection Reset. Der kann aber nicht vom Server ausgelöst werden, wie gesagt: mit Firefox funktioniert es problemlos und der Socket wird auch nicht versehentlich geschlossen.


Die Anfrage von Firefox für die Datei sieht wie folgt aus:
Code:
GET /client/lib/hibernate3.jar HTTP/1.1
Host: 127.0.0.1:14000
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Die Anfrage von WebStart:
Code:
GET /client/lib/hibernate3.jar HTTP/1.1
content-type: application/x-java-archive
accept-encoding: pack200-gzip,gzip
User-Agent: JNLP/6.0 javaws/1.6.0_03 (b05) Java/1.6.0_03
UA-Java-Version: 1.6.0_03
Host: 127.0.0.1:14000
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
If-Modified-Since: Wed, 31 Dec 1969 23:59:59 GMT
Das meiste davon ignoriere ich im Augenblick noch.
Auswerten tu ich die Get- und die Host-Zeile.
Zuerst habe ich es mit dem einfachsten Response versucht:
Code:
HTTP/1.0 200 OK
Server: TestServer
Content-type: application/x-java-archive

+daten
Bereits das hat problemlos mit Firefox funktioniert, und die entsprechende Datei wurde korrekt zum Client übertragen.

Ich habe dann den HTTP-Header noch aufgestockt:
Code:
HTTP/1.1 302 Found
server: TestServer
date: Sun, 2 Mar 2008 14:31:13 +0100
last-modified: Sun, 2 Mar 2008 14:31:13 +0100
cache-control: no-cache
pragma: no-cache
connection: close
content-type: application/x-java-archive
content-length: 2255753
Leider funktioniert es trotzdem nicht.
WebStart stellt die Anfrage weiter oben und der Server schickt erst den Header und anschließend die Daten. Irgendwann kommt es dann zu einem Connection Reset.
WebStart zeigt aber keinerlei Fehler an. Da die Daten aber nicht vollständig zum Client übertragen werden gehe ich davon aus, dass die .jar-Datei nicht vollständig ist. Das Programm auf dem Client ist somit inkonsistent.

Ich danke euch schonmal.


Gruß
Sparrow
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2008, 22:33   Nach oben    #2
Erfahrener Benutzer
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Mal so eine Vermutung ins Blaue: irgendwo einen flush() auf dem Server vergessen?

Ansonsten aber generell die Frage: Wieso nicht beispielsweise Tomcat?
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.03.2008, 23:02   Nach oben    #3
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard

Zitat:
Zitat von mepeisen Beitrag anzeigen
Mal so eine Vermutung ins Blaue: irgendwo einen flush() auf dem Server vergessen?
Um ehrlich zu sein hab ich bisher gar kein .flush() auf den OutputStream gesetzt. Der Fehler tritt ja auch bereits während der Übertragung zum Client auf.

Zitat:
Zitat von mepeisen Beitrag anzeigen
Ansonsten aber generell die Frage: Wieso nicht beispielsweise Tomcat?
Das Programm soll extrem einfach und schnell zu installieren und verteilen sein.
Genau aus dem Grund bringt das Programm einen eigenen Webserver mit um sich selbst via WebStart verteilen zu können.
Im geringsten Fall muss der Benuter/Admin das Programm nur auf dem Server starten, das wars.
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.03.2008, 10:49   Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
Standard

Was hälst du davon, einen fertigen HTTP Server zu nehmen?

http://simpleweb.sourceforge.net/index.php
http://www.savarese.org/software/barehttp/index.html
http://tjws.sourceforge.net/
http://javablog.co.uk/2007/10/27/htt...ort-to-java-5/
...
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.03.2008, 12:17   Nach oben    #5
Erfahrener Benutzer
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Das meine ich ja auch mit Tomcat. Den kann man ebenso gut mit ausliefern und halt so konfigurieren, dass es wie ein eingebauter Webserver ausschaut. Der Vorteil ist natürlcih, dass das für die Zukunft auch sehr flexibel ist und es ist wohl deutlich leichter für dich, da der Tomcat in sich stabil und gut ist.
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.03.2008, 18:32   Nach oben    #6
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard

Och, das wäre doch aber langweilig.
Außerdem soll er ja wirklich nichts weiter können als diese paar Dateien auszuliefern. Da ist mir eine Lösung wie Tomcat einfach ein bisschen zu "dick".
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.03.2008, 18:41   Nach oben    #7
Erfahrener Benutzer
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Such mal nach Java Web Start Proxy. Das macht sowas ähnliches, wenn auch um eine Art Proxy zu sein, der sich woanders die Jar-Files herholt und dann wieder zur Verfügung stellt. Aber das liesse sich anpassen. Das ganze kenne ich von meinem Arbeitgeber und ich meine auch, dass er der Java-Community oder Sun mal als Open-Source zur Verfügung gestellt wurde. Das Internet sollte Aufschluss geben.
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.03.2008, 12:59   Nach oben    #8
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard

Hmm.. mich wurmt es irgendwie, dass meine Lösung nicht funktioniert.

Hier mal der entsprechende Code meiner Methode auf dem Server

java Code:
  1. private void sendClientData(OutputStream os,String requestedPage, String host) {
  2.         String page = requestedPage.substring(8);
  3.         int bytesSend = 0;
  4.         try {
  5.             // Looking for the requested name in the pluings
  6.             Vector<String> pluginnames = Main.getClientPluginNames();
  7.             boolean sidefound = false;
  8.             for (int i = 0; i < pluginnames.size(); i++) {
  9.                 if (pluginnames.get(i).equals(page)) {
  10.                     Main.getLogger().info("Conhandler: " + handlerid + " SEND client resource: " + page);
  11.                     sidefound = true;
  12.                     File localfile = null;
  13.                     if (page.startsWith("lib/")) {
  14.                         localfile = new File("./lib/client/" + page.substring(4));
  15.                     } else {
  16.                         localfile = new File("./plugins/" + page);
  17.                     }
  18.                     InputStream is = localfile.toURI().toURL().openStream();
  19.                     // Setting optional Header-Information for http response
  20.                     ArrayList<String> optionalHeaderLines = new ArrayList<String>();
  21.                     optionalHeaderLines.add("Content-Length: " + localfile.length());
  22.                     sendHeader(os, localfile.toURI().toURL(), optionalHeaderLines);
  23.                     // Sending data to client
  24.                     int in;
  25.                     while ((in = is.read()) > -1) {
  26.                         os.write(in);
  27.                         bytesSend++;
  28.                     }
  29.                     Main.getLogger().debug("Conhandler: " + handlerid + ": " + bytesSend + " bytes send to client");
  30.                     break;
  31.                 }
  32.             }
  33.             if (!sidefound) {
  34.                 Main.getLogger().warn("Conhandler: " + handlerid + " WARN no such resource: " + page);
  35.                 writeStringToStream(httpError(404, "Page not found"), os);
  36.             }
  37.         } catch (IOException e) {
  38.             Main.getLogger().error("Conhandler: " + handlerid + " ERROR while SENDING RESOURCE to the client: " + page + " : "+ e.getMessage());
  39.             Main.getLogger().debug("Conhandler: " + handlerid + ": " + bytesSend + " bytes send to client");
  40.             e.printStackTrace();
  41.         }
  42. }

Geändert von sparrow (04.03.2008 um 13:05 Uhr).
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.03.2008, 15:25   Nach oben    #9
Erfahrener Benutzer
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Ich würde dir empfehlen, die Daten immer Stückweise zu verschicken, nicht jedes Byte/int einzeln. baue dir beispielsweise ein Byte-Array:
byte[] buf = new byte[2048];

Das geht um ein vielfaches schneller und eventuell behebt das damit bereits dein Problem. Achja: Wo ist das flush?
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.03.2008, 22:22   Nach oben    #10
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard

Das Problem besteht leider weiterhin.

java Code:
  1. private void sendClientData(OutputStream os,String requestedPage, String host) {
  2.         String page = requestedPage.substring(8);
  3.         int bytesSend = 0;
  4.         try {
  5.             // Looking for the requested name in the pluings
  6.             Vector<String> pluginnames = Main.getClientPluginNames();
  7.             boolean sidefound = false;
  8.             for (int i = 0; i < pluginnames.size(); i++) {
  9.                 if (pluginnames.get(i).equals(page)) {
  10.                     Main.getLogger().info("Conhandler: " + handlerid + " SEND client resource: " + page);
  11.                     sidefound = true;
  12.                     File localfile = null;
  13.                     if (page.startsWith("lib/")) {
  14.                         localfile = new File("./lib/client/" + page.substring(4));
  15.                     } else {
  16.                         localfile = new File("./plugins/" + page);
  17.                     }
  18.                     InputStream is = localfile.toURI().toURL().openStream();
  19.                     // Setting optional Header-Information for http response
  20.                     ArrayList<String> optionalHeaderLines = new ArrayList<String>();
  21.                     optionalHeaderLines.add("Content-Length: " + localfile.length());
  22.                     this.sendHeader(os, localfile.toURI().toURL(), optionalHeaderLines);
  23.                     // sendint the data to the client
  24.                     int in = 0;
  25.                     int bufferCounter = 0;
  26.                     byte&#91;&#93; sendBuffer = new byte&#91;SEND_BUFFER_SIZE&#93;;
  27.                     while ((in = is.read()) > -1) {
  28.                         sendBuffer&#91;bufferCounter&#93; = (byte) in;
  29.                         bufferCounter++;
  30.                         if (bufferCounter >= sendBuffer.length) {
  31.                             os.write(sendBuffer);
  32.                             os.flush();
  33.                             sendBuffer = new byte&#91;SEND_BUFFER_SIZE&#93;;
  34.                             bufferCounter = 0;
  35.                         }
  36.                         bytesSend++;
  37.                     }
  38.                     os.write(sendBuffer);
  39.                     os.flush();
  40.                     os.close();
  41.                     Marmota.getLogger().debug("Conhandler: " + handlerid + ": " + bytesSend + " bytes send to client");
  42.                     break;
  43.                 }
  44.             }
  45.             if (!sidefound) {
  46.                 Main.getLogger().warn("Conhandler: " + handlerid + " WARN no such resource: " + page);
  47.                 writeStringToStream(httpError(404, "Page not found"), os);
  48.             }
  49.         } catch (IOException e) {
  50.             Main.getLogger().error("Conhandler: " + handlerid + " ERROR while SENDING RESOURCE to the client: " + page + " : "+ e.getMessage());
  51.             Main.getLogger().debug("Conhandler: " + handlerid + ": " + bytesSend + " bytes send to client");
  52.             e.printStackTrace();
  53.         }
  54.     }


Nach einigen Tests glaub ich, dass das ganze mit dem Cache von JavaWS zusammen hängt.
Zumindest scheint es so als würde WS die Datei noch einmal anfordern wenn es ein Problem mit dem Archiv gibt. Dann läuft der Download auch durch.
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[JAVA] Wie man aus Java mit einem PHP-Script kommuniziert sparrow Tutorials 0 25.03.2006 22:24
[BUCH] Java ist auch eine Insel kampet Literatur 5 22.02.2005 14:40
FTP Client in Java? tuxsymptom