2016-05-15 7 views
0

Ich benutze Java/libgdx und ich habe ein Problem mit Sockets aufgetreten. Es funktioniert langsam. Mein kleines Spiel präsentiert Charaktere, die sich nach links und rechts bewegen. Nach dem Senden von tcp/localhost bewegt es sich langsamer. Ich füge zwei Codeteile aus der Klasse Client und Server hinzu. Bitte hilf mir. Ich blieb stecken. Danke im Voraus. Wenn es notwendig ist, werde ich den ganzen Code setzen.Socket funktioniert zu langsam :: java/libgdx

// CLIENT

public class ClientThread extends Thread{ 

    public void run(){ 

     hints = new SocketHints(); 
     hints.connectTimeout = 11000; 

     while(trwanie) 
     { 
      socket = Gdx.net.newClientSocket(Protocol.TCP, "localhost", 8784, hints); 
       if(!socket.isConnected()) 
        System.out.println("NIE JEST"); 
       //System.out.println("socket null?"); 
      if(socket!=null) 
      { 
       try { 
        socket.getOutputStream().write(new String("CZESC server").getBytes()); // wiadomosc wysylana 
        //byte[] read = new byte[1024]; 
        socket.getInputStream().read(read); //odebrana od servera 
        readString = new String(read).trim(); 
        XY = readString; 
        StringToFloat(); 

       } catch (IOException e) { 
        e.printStackTrace();socket.dispose(); 
       } 
      } 
      //socket.dispose(); 
      if(Gdx.input.isKeyPressed(Keys.ESCAPE)) 
      { 
       WylaczPentle(); 
       System.out.println("Wychodzimy z pentli"); 
       Gdx.app.exit(); 
      } 
     } 
     socket.dispose();  
    } 
} 

// Server

public class ServerThread extends Thread{ 

    public void run() 
    { 
     hints = new ServerSocketHints(); 
     hints.acceptTimeout = 12000; 
     socketHints = new SocketHints(); 
     while(trwanie) 
     { 
      server = Gdx.net.newServerSocket(Protocol.TCP, "localhost", 8784, hints); 
      socket = server.accept(socketHints); 
      if(socket != null) 
      { 
       //byte[] read = new byte[1024]; 
       try { 
        socket.getInputStream().read(read); 
        socket.getOutputStream().write((WspolzednaX+"/"+WspolzednaY).getBytes());                   //--- 

       } catch (IOException e) { 
        e.printStackTrace(); 
        server.dispose(); 
       } 
      } 
      server.dispose(); 
      if(Gdx.input.isKeyPressed(Keys.ESCAPE)) 
      { 
       WylaczPentle(); 
       System.out.println("Wychodzimy z pentli"); 
       Gdx.app.exit(); 
      } 
     } 
     server.dispose(); 
    } 
} 
+0

Wenn Sie Strings schreiben möchten, sollten Sie besser einen DataOutputStream und [writeUTF()] (https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html#writeUTF (java.lang.String)). Und vergessen Sie nicht, die geschriebenen Daten zu löschen. – Robert

Antwort

1

Ein Grund, dass Ihr Code langsam ist, dass Ihr Kunde immer wieder öffnen zu sein scheint/mit/eine Buchse mit dem gleichen Server zu schließen . Wenn man bedenkt, dass das Öffnen und Schließen viel Zeit in Anspruch nimmt (um den Netzwerk-Paketaustausch durchzuführen), sollten Sie den Socket einmal öffnen und offen halten, während der Client und der Server mehrere "Nachrichten" austauschen.

Es gibt andere Probleme mit Ihrem Code. Zum Beispiel gibt die Methode read(bytes[]) eine int zurück, die angibt, wie viele Bytes eigentlich gelesen wurden. Ihr client- und serverseitiger Code ignoriert dies und nimmt an, dass alle read.length Bytes im Puffer gültige Daten enthalten.

+0

Danke für den intelligenten Tipp, ich korrigierte: socket.getInputStream(). Lesen (lesen, 0, lesen.length); In Bezug auf den ersten Absatz ist mir diese Tatsache bekannt. Aber jedes Mal, wenn ich versuche, Teile von While(), Exceptions oder einigen Fehlern zu entfernen, gehen alle Höllenrisse verloren. Wie kann ich meinen Code in while (trwanie) ändern? [trwanie = dt. dauerhaft]?, sollte ich hier Fehler von der Konsole aus? Bitte helfen Sie. Ich denke, es ist das Hauptproblem meines Spiels. Vielen Dank für alle Hilfe – Cenarius

-1

Gelöst :) Das Problem war mit dem Treffen von Client und Server. Ich habe das Gewinde 0,5s vorher hinzugefügt, während(), jetzt funktioniert es gut:))

Danke an alle.

+1

Sie müssen nicht zum Netzwerk-Code schläft. Es sind bereits Blöcke eingebaut. Das Schlafen im Netzwerkcode ist buchstäblich eine Zeitverschwendung. Alles, was es tut, ist, andere Fehler zu maskieren, wie zum Beispiel das Ignorieren der von 'read()' zurückgegebenen Länge, und diese Fehler kehren zurück. – EJP