unvollständige Daten: Http Client-Server-Kommunikation

Status
Nicht offen für weitere Antworten.

giofyxle

Neues Mitglied
Ich schreibe gerade an einem Server (in java) der mit Clients (in C++) kommuniziert. Als Kommunikationsweg wurde das http-Protokoll festgelegt.

Der Server horcht in einer while Schleife auf Anfragen aus dem Netz. Wenn eine Anfrage ankommt, wird in dieser while-Schleife in einem neuen Thread eine Bearbeitungsklasse gestartet. In der Bearbeitungsklasse lese ich die Daten verarbeite sie zu einem Ergebnis (hier XML) und will diese zusammen mit einem http-Header an den Client zurückschicken.

Die Daten kommen aber nur dann zuverlässig beim Client an, wenn ich nach dem out.write();out.flush(); eine recht lange Zeit warte. Ich habe deshalb eine sleep-Funktion an dieser Stelle eingebaut.

Wenn ich diese Zeit zu kurz wähle, kommen beim Client nur Bruchstücke zufälliger Länge der zu übertragenden Daten an.


Ich kenne ein solches Problem aus einer reinen C++ Client-Server –Anwendung. Dort hatten wir allerdings kein http-Protokoll verwendet. Wir hatten damals vereinbart, dass der Empfänger immer ein Quittungsbyte an den Sender zurückschickt, wenn er die Daten vollständig erhalten hatte; der Sender musste dann solange warten.

Aber wie kann man das mit dem http_Protokoll machen?
Die sleep-Funktion ist ja nur eine dumme Krücke, die bestimmt nicht unter allen Voraussetzungen rausreicht….

Eine andere Lösung ist, das Socket nicht zu schliessen. Das habe ich auch ausprobiert. Aber was passiert, wenn der Server in den Bearbeitungsthreads das Socket nicht schliesst? Leidet darunter die Performance, oder werden die Ressourcen des Servers sinnlos verbraucht? Leider habe ich vom technischen Hintergrund zu wenig Vorstellung.



Hier mein Code:

zuerst die Serverschleife:
Code:
private void startServing()
{
while ( server != null  && shutdown.value == false)
	{
		Socket client = null;
		try
		{
			client = server.accept();
			Thread t = new  Thread( new Bearbeitung(client,this.config));
			t.start();
		}
		catch ( IOException e )
		{
			if ( client != null )
	    		try { client.close(); 
		}
		catch ( IOException e2 ) { e2.printStackTrace(); }
		client = null;		
	}  
}

Dann der Bearbeitungsthread:

Code:
public class Bearbeitung implements Runnable 
{
	private Socket client;
	private RkConfig config = null;

	public Bearbeitung(Socket s, RkConfig conf) 
{
		client = s;
		config = conf;
	}
	
	
	public void run() {
		if (client != null) {
			byte[] abErg = null;

			try {
				HttpInput input = new HttpInput(client.getInputStream());
				OutputStream out = client.getOutputStream();
	
				input.readHttp(); // 
				String strData = input.getDataString();
				strData = strData.trim();
				// jetzt Daten verarbeiten:
				abErg = datenVerarbeiten(strData);			
				
				
				// einen Http-Header als AsciiByte-Array erstellen:	
				HttpHeaders httphead = new HttpHeaders();
				httphead.setContentlength(abErg.length);

				byte[] abHead = httphead.writeHeaderToAsciiByteArray();
				// den Http-Header verschicken
				out.write(abHead);
				// Ergebnis verschicken.
				out.write(abErg);
				out.flush();
				

				// nur wenn ich hier lange warte, kommen beim Client die Daten 
				// zuverlässig an!
				Thread.sleep(50000);
				System.out.println("\r\nDaten an Client verschickt.");
			} 
			catch (IOException e) {e.printStackTrace();}
			catch (InterruptedException e) {e.printStackTrace();}
			finally 
			{
				try 
				{
					// genauso, wenn ich dieses Close wegnehme, funktioniert die
					// Datenübertragung...
					client.close();
				} 
				catch (IOException e) {e.printStackTrace();}
				client = null;
			}
		}
	}

}


Nochmals meine Fragen:

  • - Verbrauche ich die Ressourcen des Servers, wenn serverseitig die Sockets nicht geschlossen werden?
    - Gibt es eine andere Möglichkeit, festzustellen, wann der Client alle Daten empfangen hat, bzw. eine andere Möglichkeit, die Daten zu verschicken, so dass ich das Socket schliessen kann!?

Danke! Georg
 
M

mightymop

Gast
giofyxle hat gesagt.:
Dann der Bearbeitungsthread:

Code:
....
....
HttpInput input = new HttpInput(client.getInputStream());
OutputStream out = client.getOutputStream();

input.readHttp(); // 
String strData = input.getDataString();
strData = strData.trim();
// jetzt Daten verarbeiten:
abErg = datenVerarbeiten(strData);			

// einen Http-Header als AsciiByte-Array erstellen:	
HttpHeaders httphead = new HttpHeaders();
httphead.setContentlength(abErg.length);

byte[] abHead = httphead.writeHeaderToAsciiByteArray();
// den Http-Header verschicken
out.write(abHead);
// Ergebnis verschicken.
out.write(abErg);
out.flush();

// nur wenn ich hier lange warte, kommen beim Client die Daten 
// zuverlässig an!
Thread.sleep(50000);
System.out.println("\r\nDaten an Client verschickt.");
....
....

Hallo Kollege...

also mir würde auf anhieb die erklärung einfallen, dass auf dem EthernetFrame für den Datenverand nur ca. 1500Bytes zur Verfügung stehen und da du dort alle Daten mit einem mal versuchst loszuschicken könnte es zu
einen Datenstau kommen... Versuch doch mal die Daten gestückelt in 1024 Bytes großen Paketen abzuschicken etwa so:

Code:
....
....

byte[] abHead = httphead.writeHeaderToAsciiByteArray();
// den Http-Header verschicken
int pos = 0;
while (pos<abHead.length){

      if (abHead.length>=1024) {
      out.write(abHead,pos,pos+1024); 
      out.flush();
      pos+=1024;
      }
      else {
      out.write(abHead,0,abHead.length); 
      out.flush();
        pos=abHead.length;
      }
}

// Ergebnis verschicken.
pos = 0;
while (pos<abErg.length){

      if (abErg.length>=1024) {
      out.write(abErg,pos,pos+1024); 
      out.flush();
      pos+=1024;
      }
      else {
      out.write(abHead,0,abErg.length); 
      out.flush();
        pos=abErg.length;
      }
}
....
....


der code ist mal eben auf die schnelle getippselt worden ...
ich hoffe es klappt....

cu mightymop
 

giofyxle

Neues Mitglied
Hallo!

Leider ist das nicht das Problem.
Egal, ob ich an die Write-Funktion den ganzen Puffer auf einmal übergebe, oder in 1024-er Stückchen, kommen die Daten beim Client manchmal unvollständig an.
Wie gesagt, wenn ich den Socket zum client nach dem write() nicht schliesse, oder vorher eine lange Zeit warte, funktioniert alles wunderbar....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Daten per API senden, parallel Netzwerkprogrammierung 9
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S Daten über TCP/IP senden Netzwerkprogrammierung 3
B Daten an Javaprogramm per URI Aufruf übergeben Netzwerkprogrammierung 7
N websocket - keine Daten mehr nach ca 80 Sekunden Netzwerkprogrammierung 0
C Spezielle Daten aus Website entnehmen Netzwerkprogrammierung 5
H Daten auf einer Webseite eintragen Netzwerkprogrammierung 11
A Socket Daten in Textdokument speichern? Netzwerkprogrammierung 1
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
J Daten von einem HTML-Textfeld abrufen Netzwerkprogrammierung 3
S Fakturierungsprogramm - Daten aktuell halten (blutiger Anfänger) Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4
K Server liest Daten nicht Netzwerkprogrammierung 6
L HTTP Daten an Server übergeben Netzwerkprogrammierung 2
R Daten von Cloud laden Netzwerkprogrammierung 5
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
P Socket Best Practice: Daten bündeln Netzwerkprogrammierung 5
E Verfügbarkeit von Daten in Streams Netzwerkprogrammierung 4
F Daten aus Internetseiten auslesen Netzwerkprogrammierung 56
S Server Client Daten hin und herschicken Netzwerkprogrammierung 2
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
H Daten an Textfeld einer Webseite schicken Netzwerkprogrammierung 2
A versch. Daten im Stream erkennen Netzwerkprogrammierung 2
D daten per post senden Netzwerkprogrammierung 3
M Senden von Daten nicht direkt möglich? Netzwerkprogrammierung 6
J Applet soll Daten auf Server ablegen - einfachster Weg fuer n00bs? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
F UDP Daten kommen nicht an Netzwerkprogrammierung 22
E Socket OutputSream abbruch.Wegen zuviel !empfangener! Daten? Netzwerkprogrammierung 10
C Client zu Client Daten übertragen Netzwerkprogrammierung 13
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Socket XML-Daten und Parameter an Server schicken Netzwerkprogrammierung 3
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P HttpClient - Daten einer Website "unvollständig" Netzwerkprogrammierung 5
P Server/Client Daten empfangen, wenn Daten gesendet werden Netzwerkprogrammierung 9
K Socket Daten lesen ohne Längenangabe Netzwerkprogrammierung 19
T RMI Effizenteste Übertragung von Daten Netzwerkprogrammierung 6
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
B Socket Daten empfangen funktioniert nicht richtig - wo liegt der Fehler? Netzwerkprogrammierung 7
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
E Daten kommen anders an als gesendert ?! Netzwerkprogrammierung 6
S HttpURLConnection POST splittet Daten in zwei Pakete Netzwerkprogrammierung 9
F POST-Daten sende Netzwerkprogrammierung 3
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
N Per POST -Methode Daten an den Web-Server übertragen. Netzwerkprogrammierung 9
Iron Monkey Große Daten ins Vector füllen Netzwerkprogrammierung 4
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
D Daten, die mit PHP erzeugt werden, mit Java auslesen Netzwerkprogrammierung 8
M Ethernet Daten abfangen Netzwerkprogrammierung 13
F Daten senden und empfangen mit Applet Netzwerkprogrammierung 8
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
S Daten per GET-Methode Netzwerkprogrammierung 2
H Server soll Daten schicken, aber wie? Netzwerkprogrammierung 47
M Socket schließt bevor Daten komplett geladen Netzwerkprogrammierung 5
C Flash Daten an Java senden, wie serialisieren? Netzwerkprogrammierung 3
E rxtx serielles senden von Daten Netzwerkprogrammierung 2
D Socket, Daten über BufferedWriter senden Netzwerkprogrammierung 18
G TCP Verbindung überprüfen OHNE daten zu verschicken Netzwerkprogrammierung 11
M Daten übers Netz verschlüsselt übertragen? Wie? Netzwerkprogrammierung 18
J Post-Daten an URL schicken Netzwerkprogrammierung 2
U Image erzeugen aus empfangenen Daten Netzwerkprogrammierung 7
A Wie werden Daten versendet? "Crashcode" Netzwerkprogrammierung 4
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3
E Multi-Part Form-Daten mit HttpURLConnection Netzwerkprogrammierung 6
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
T Daten über GSM verschicken Netzwerkprogrammierung 4
M Einfachste Möglichkeit aus'm Applet Daten an Server senden Netzwerkprogrammierung 6
P Verschiedene Daten über einen Stream Netzwerkprogrammierung 4
M Verliere Daten mit WinXP Netzwerkprogrammierung 10
O eingehende Daten speichern Netzwerkprogrammierung 3
D UDP-Daten anzeigen Netzwerkprogrammierung 2
D Daten per Server- Client nur als byte verschicken? Netzwerkprogrammierung 3
A daten an php script per post senden und ausgabe einlesen Netzwerkprogrammierung 6
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
H Datei mit Anhang via http "hochladen" Netzwerkprogrammierung 16
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
R Anfängerbeispiel: Suche Java-Anwendung die http-Anfragen in Tomcat liest Netzwerkprogrammierung 8
O HTTP Wer hilft mit meinem UTF-8 http Request ? Netzwerkprogrammierung 1
G localhost im Backend https vs. http Netzwerkprogrammierung 9
J Simple HTTP Framework (basierend auf expressjs) Netzwerkprogrammierung 1
M HTTP Http requests aufzeichnen Netzwerkprogrammierung 2
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
J HTTP Befehl via HTTP senden ohne Browser öffnen Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
M http request and response Netzwerkprogrammierung 0
M Verbindungszeit berechnen (TCP, HTTP/1.0, HTTP/1.1) Netzwerkprogrammierung 2
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
U HTTP XML vom Server abholen oder http Abfragen, Entscheidung treffen Netzwerkprogrammierung 0
P HTTP Server / Client Netzwerkprogrammierung 1
S HTTP-Requeste von Browser mit Java sniffen? Netzwerkprogrammierung 9
E HTTP java.lang.IllegalArgumentException: protocol = http host = null Netzwerkprogrammierung 1
M Server mit HTTP Netzwerkprogrammierung 9
H Sockets oder HTTP- Methoden? Netzwerkprogrammierung 3
B Socket HTTP-Request führt zu Endlosschleife Netzwerkprogrammierung 5
D HTTP nochne frage zu http requests Netzwerkprogrammierung 6
D HTTP Bräuchte hilfe mit Http Requests Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben