2016-05-15 15 views
0

私はjava/libgdxを使用していますが、ソケットに問題が発生しました。それは遅く動作します。私の小さなゲームは、左右に動くキャラクターを提示します。 tcp/localhostで送信した後、遅くなります。私はクライアントとサーバーのクラスから2つのコードを追加します。私を助けてください。私はくっついた。前もって感謝します。必要な場合は、コード全体を入れます。あなたのコードが遅いソケットが遅すぎる:: 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();  
    } 
} 

//サーバー

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

ストリングを書きたい場合は、DataOutputStreamと[writeUTF()](https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html#writeUTF java.lang.String)))。そして、書かれたデータをフラッシュすることを忘れないでください。 – Robert

答えて

1

一つの理由は、あなたのクライアントが繰り返し同じサーバにソケットをクローズ/使用/開いているように見えるということです。オープンとクローズにはかなりの時間がかかります(ネットワークパケット交換を実行するために)、クライアントとサーバーが複数の "メッセージ"を交換している間は、Socketを一度開いて開いておくことをお勧めします。

コードには他にも問題があります。たとえば、read(bytes[])メソッドは、の実際にの何バイトが読み取られたかを示すintを返します。クライアント側とサーバー側のコードでは無視されており、バッファ内のすべてのread.lengthバイトに有効なデータが含まれていると仮定しています。

+0

スマートチップのおかげで、私は訂正しました: socket.getInputStream()。read(read、0、read.length); 最初の段落について、私はこの事実を認識しています。しかし、私がwhille()からいくつかの部分をダンプしようとするたびに、例外やいくつかのエラーはすべて地獄がゆるむ。 while(trwanie)でコードを変更するにはどうしたらいいですか? [trwanie = eng。私はコンソールからのエラーをここで過ぎるべきですか?助けてください。私はそれが私のゲームの主な問題だと思う。すべての助けをたくさんありがたいです – Cenarius

-1

解決済み: 問題は、クライアントとサーバーの会議でした。 while()の前にスレッド0.5,5を追加しました。現在はうまくいきます:))

ありがとうございます。

+1

ネットワーキングコードに睡眠を加える必要はありません。すでにブロックが組み込まれています。ネットワーキングコードのスリープは文字通り時間の無駄です。 'read()'によって返された長さを無視するなどの他のバグをマスクするだけで、それらのバグが返されます。 – EJP