Socket Performance erhöhen?

nambrot

Grünschnabel
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.
Code:
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);
		}
	}

}
 
Wieso erstellt du z.B. in der inneren while-Schleife immer wieder nen neuen Reader?
 
hey
das mit dem reader stimmt, da war ich wohl sonst wo.
Natürlich sollte man den nur einmal generieren.
Ich hab den dann außerhalb der while schleife gepackt.
Auch die außerste Wihle schleife ist sinnlos, aber sowas merkt man immer nur hinterher^^
Ein Problem dass ich habe ist dann aber, dass er durch die immer wahrheit der inneren Whileschleifen auch versucht zu lesen, obwohl noch kein neues Paket angekommen ist und ich dadurch zu null schleifen komme.
Und wieso soll ich den Reader rausnehmen?
dann kan nich doch nichts lesen.
 
oh, ich wusste gar nicht, dass man auch ohne Buffern machen kann.
Was ist denn der Vorteil daran? Kann man dann überhaupt noch die einzelnen Pakete lesen?
 
Buffered hat den Vorteil das nicht jedes Byte einzeln gelesen wird sondern immer ein ganzer Block. Beim Aufruf der read Methode muss dann nicht jedes mal erneut auf das zu lesende Medium zugegriffen werden sondern es kann die Information aus dem Buffer gelesen werden. Dies hat dann einen Geschwindigkeitsvorteil beim Zugriff z.B. beim lesen.
Beim nicht 'gebufferten' lesen wird jedes Byte einzeln von der HD gelesen.
Nun könnte ich mir vorstellen das in deinem Fall ein ungepuffertes Lesen und Schreiben evtl. schneller sein könnte da du ja sofort auf den ankommenden Datenstrom reagieren willst, und nicht erst warten willst bis der Buffer gefüllt ist um mit der Weiterverarbeitung fortzufahren.
Aber wie gesagt, ich bin mir nicht sicher ob es wirklich was bringt. Versuche es doch einfach mal aus, ist ja keine große Änderung. Das Ergebniss würde mich auch interessieren.
 
hey
das hört sich sehr logisch an
das PRoblem:

Reader bufferedReader = new Reader(new InputStreamReader(client_socket.getInputStream()));

verursacht den Fehler:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot instantiate the type Reader

at Test.main(Test.java:23)
außerdem gibt read() ja dann nur irgendwelche int zahlen aus. Ich weiß ja gar nicht wie ich diese verwerten soll.
 
Wenn du mal in der API schaust siehst du das Reader ein Interface ist und InputStreamReader dieses Interface schon implementiert.

Das was du da zurückbekommst sind bytes. Besser ist es aber das ganze in ein Byte-Array einzulesen. Das ByteArray kannst du z.B. in einen ByteBuffer stecken und darüber auslesen.

Problem bei nem BufferedReader mit readLine ist, dass er bis zu einem Zeilenumbruch liest. Eigentlich willst du aber keinen machen denke ich mir....
 
Hey danke, ich hab mich schon gewunder wozu es die KLasse Reader gibt.
ICh hab also daraus nen InputStreamReader ohne Buffered Reader gemacht, kommt mir aber nicht wirklich schneller vor:
Ich denke einfach mal das Parsen dauert viel zu lange. Und während er parst kommen schon die nächsten Pakete die die while schleife verpasst. Ich muss wohl auf New IO umsteigen?
Code:
InputStreamReader bufferedReader = new InputStreamReader(client_socket.getInputStream());

		    	//BufferedReader newReader = new BufferedReader()
		        while(true){
		        	//BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(client_socket.getInputStream()),30);
		        	
		            pozX = MouseInfo.getPointerInfo().getLocation().x;
				    pozY = MouseInfo.getPointerInfo().getLocation().y;
				    //System.out.println(bufferedReader.getEncoding());
				    char[] array1 = new char[8];
				    int line = bufferedReader.read(array1);
				    String nachricht = new String(array1, 0, line);
				    System.out.println(nachricht);
				    String[] results = nachricht.split("<"); 
				    int newX = 1024/2 - Integer.parseInt(results[0]);
				    int newY = 768/2 - Integer.parseInt(results[1]);
 
Zurück