2016-05-15 43 views
0

我正在使用java/libgdx,並且遇到套接字問題。它工作緩慢。我的小遊戲呈現出左右移動的角色。通過tcp/localhost發送後,它移動得更慢。我從客戶端和服務器類添加兩段代碼。請幫幫我。我被困住了。提前致謝。如果有必要,我會把整個代碼。套接字工作太慢:: 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

一個原因,你的代碼是慢是您的客戶端似乎反覆開/使用/關閉套接字到同一臺服務器。考慮到打開和關閉需要很長時間(執行網絡數據包交換),您最好打開一次套接字,並在客戶端和服務器交換多個「消息」時保持打開狀態。

您的代碼還有其他問題。例如,read(bytes[])方法返回一個int,表示實際上讀取的字節數。您的客戶端和服務器端代碼忽略了這一點,並假定緩衝區中的所有read.length字節都包含有效數據。

+0

感謝您的智能提示,我更正了: socket.getInputStream()。read(read,0,read.length); 關於第一段,我知道這個事實。但是每次我嘗試從whille()中刪除某些部分,除非有一些錯誤或者一些錯誤,所有的地獄破壞都會丟失。如何在(trwanie)中更改我的代碼? [trwanie = eng。持久]?,我應該從控制檯過去這裏錯誤嗎?請幫忙。我認爲這是我的遊戲的主要問題。感謝所有幫助 – Cenarius

-1

已解決:) 問題在於會議客戶端和服務器。我在while()之前添加了線程0,5s,現在它運行良好:))

謝謝大家。

+1

您不需要添加睡眠網絡代碼。已經有內置的塊。睡在網絡代碼中實際上是浪費時間。它所做的就是屏蔽其他錯誤,例如忽略'read()'返回的長度,並且這些錯誤將會返回。 – EJP