# Datenübertragung per Socket nur alle 200ms



## moccajoghurt (30. Nov 2011)

Hi,

ich arbeite immernoch im Rahmen einer Studienarbeit an einem Online-Game und bin auf eine seltsame Beobachtung gestoßen:

Der Server sendet an die verbundenen Clienten des Spiels Strings (immer ca 15 Zeichen groß).
Wenn ich versuche mehrere Strings innerhalb von 200ms zu senden, dann bekomme ich nicht mehrere Strings im Zeitraum von 200ms, sondern ALLE Strings die sich in den 200ms angesammelt haben auf einen Schlag. Also letztlich alle 200ms einen Haufen angesammelter Strings...
Leider ist das sehr ungünstig, weil das Online-Game in Echtzeit läuft und es praktischer wäre wenn die Daten sofort ankommen (ansonsten muss ich aufwendige Vorberechnungen auf der Client-Seite machen - was ich inzwischen auch gemacht habe und ganz gut funktioniert, aber trotzdem nicht perfekt ist).
Das Problem tritt nur auf, wenn ich das Spiel über das Internet spiele. Über ein LAN kommen die Strings auch in kleineren Abständen als 200ms an.

Was ist das, wie werd ich das los? Haben andere Spiele dann nicht ähnliche Probleme? Ist es der Router?

Gruß moccajoghurt


----------



## Michael... (30. Nov 2011)

Hört sich an als würde da was gepuffert. Wie ist die Kommunikation implementiert UDP oder TCP? Warum werden Strings übertragen (und evtl. wie werden Sie übertragen)? Warum nicht einfach Informationen codiert in Bytes.


----------



## moccajoghurt (30. Nov 2011)

TCP wird glaub ich standardmäßig für die Socketkommunkation in Java verwendet, daher sollte es TCP sein.
Strings haben wir zur Übertragung genommen, weil es für uns dadurch praktischer und einfacher ist die Informationen zu übertragen.

Wir übertragen die Strings über den PrintWriter. Hier mal der Codeausschnitt, der überträgt.


```
final String p1_fdata = data + 1;
		new Thread(new Runnable() {
			public void run() {
				pwriter_1.println(p1_fdata);
				pwriter_1.flush();
			}
		}).start();
```

(Bei dem Spiel ist es wichtig, dass die Clienten zum selben Zeitpunkt exakt diesselben Daten erhalten und synchronisieren. Deshalb senden wir einen String der die benötigten Daten enthält und pro String findet immer eine Synchronisierung statt.)


----------



## Lumaraf (30. Nov 2011)

Außerdem solltest du auf deinen Sockets am besten Socket#setTcpNoDelay(true) aufrufen. Wenn man die Option nicht aktiviert können auch schnell Verzögerungen beim Senden von kleinen Datenpacketen entstehen. Auf Wikipedia gibts ne gute Erklärung zu der TCP Optimierung: Nagle's algorithm - Wikipedia, the free encyclopedia


----------



## Empire Phoenix (1. Dez 2011)

Alternativ zu Bagles algorithm, einfach jedesmal flush aufrufen, wobei der printwriter das ja scheinbar intern nicht weiterleitet, wenn man zb, nen DataOutputstream nimmt, werden immer genau dann die packet weiergeleitet, wenn der die Daten rauschicken soll (also wenn alle geschreiben sind die benötigt werden, dann hat man ncoh den vorteil der zusammenfassung der tcp packete)


----------

