# Socket Performance erhöhen?



## nambrot (21. Mai 2008)

Hi
ich habe leider keinen passenderen Titel finden können.
Was ich will ist kontinuierlich Daten zu meinem Server zu schicken. Diese soll er verwerten und damit die Maus bewegen.  Da es sich um eine Maus handelt sollte die Bewegung auch flüssig verlaufen, deshalb schicke ich die Daten von meinem Client mit ca 50 - 100 ms zwischen jedem Senden.
Wenn ich allerdings die Zeit messe zwischen den Mausbewegungen so kann ich nur einen Abstand von 200 ms messen.
Wie kann ich meinen Server also noch verbessern?
NewIO Libs? MultiThreading?
Ich habe keine Ahnung:
Hier der Code, ich hoffe ihr könnt mir helfen.

```
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import java.io.*;
import java.io.IOException; 
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args)
		throws AWTException,IOException{
		int pozX;
		int pozY;
	    long startzeit = System.currentTimeMillis();
	    long endzeit;
		Robot robot = new Robot();
		try {
		    ServerSocket serverSocket = new ServerSocket(3258);
		    while(true) {                              
		    	Socket client_socket = serverSocket.accept();
		    	System.out.println(client_socket);
		    	client_socket.setTcpNoDelay(true);
		                   
		        while(true){
		        	BufferedReader bufferedReader = 
		                new BufferedReader(
		                    new InputStreamReader(
		                        client_socket.getInputStream()));
		            pozX = MouseInfo.getPointerInfo().getLocation().x;
				    pozY = MouseInfo.getPointerInfo().getLocation().y;
				    String line = bufferedReader.readLine();
				    String[] results = line.split("<"); 
				    int newX = 1024/2 - Integer.parseInt(results[0]);
				    int newY = 768/2 - Integer.parseInt(results[1]);		    
				    robot.mouseMove(pozX+newX/4,pozY-newY/4);
				    System.out.println(line);
				    endzeit = System.currentTimeMillis();
				    System.out.println(endzeit-startzeit+" ms" );
				    startzeit = System.currentTimeMillis();
			    }
		      
		    }
		} catch (IOException e) {
		    System.out.println("Could not listen on port: 3258");
		    System.exit(-1);
		}
	}

}
```


----------



## SlaterB (21. Mai 2008)

was passiert denn, wenn du beim Client weniger oder gar nicht wartest,
irgendwann muss doch mal die Zeit beim Server runtergehen..

oder schwankt der Abstand zwischen schnell und langsam?


----------



## nambrot (21. Mai 2008)

der abstand schwankt gar nicht mehr, dh er geht einfach nicht unter 203 ms.
hab die frequenz auf 20 ms geschlatet beim client, keine verbesserung. Ich vermute einfach mal dass der Server die Pakete überspringt...
Ich habe auch versucht zum Beispiel Zahlen von 1-100 abzusenden und zu schauen welche Zahlen verloren gehen.
Komischerweise kommen nur 0 und 1 an...


----------



## FArt (25. Mai 2008)

Leider sieht man hier nicht die in den Socket schreibende Seite.

Ein gepufferter Stream ist in deinem Fall sicher kontraproduktiv, da er genau das Gegenteil bewirkt.

Dass bei deinem Zähler nicht alle Werte ankommen, kommt entweder durch die gepufferten Streams oder einen Programmierfehler.

Schreibe doch mal ein Minimalbeispiel (Client und Server) und poste das. Versuche auch selber mal eine Fehlereingrenzung durch Messbeispiele: Client und Server auf einem Rechner, Client und Server im LAN, ...

Wenn der Java-Code funktioniert, dann liegt der Rest in deinem Netz.

Noch ein Tipp: UDP ist in der Regel schneller und würde sich für dein Vorhaben anbieten, bietet aber keine Absicherung gegenüber verlorenen Paketen oder über die Empfangsreihenfolge.


----------



## tuxedo (26. Mai 2008)

a) Immer schön brav einen flush() machen
b) nix mit "Buffered*" benutzen
c) keine Strings verwenden, eher einen DataInputStream und die Daten so senden. Das spart die String-Verarbeiterei und das "parseInt"
d) in einem lokalen Netzwerk ist TCP sicherlich ausreichend wenn man nicht noch Aufwand für ein korrektes Protokoll - welches auf UDP aufsetzt - betreiben will. Oftmals ist es sogar über's Internet "problemlos" wenn da die Latenzen okay sind (Hintergrund: Audioübertragungen via TCP durch halb Deutschland klappen bei mir ziemlich gut, und da kommts ja quasi auf jede Millisekunde an). Nichts desto trotz: UDP ist schneller als TCP

- Alex


----------

