2017-03-03 2 views
0

Ich versuche, von einem Client, der libgdx für die Schnittstelle zu einem Server verwendet, eine Verbindung herzustellen. Ich benutze Kryonet sowohl auf dem Client als auch auf dem Server. Es funktioniert jedoch nicht. Irgendeine Idee, was ist los?Client mit Server verbinden Kryonet und Libgdx

Hier ist der Code, den ich im Client verwenden:

 Client client = new Client(); 
     Kryo kryo = client.getKryo(); 
     kryo.register(String.class); 
     client.start(); 
     new Thread() { 
      public void run() { 
       try { 
        client.connect(5000, "localhost", 54555, 54777); 
        client.addListener(new Listener() { 
         public void received(Connection connection, Object object) { 
          if (object instanceof String) { 
           String response = (String) object; 
           System.out.println(response); 
          } 
         } 
        }); 
       } catch (IOException e) { 
        Log.warn("expection", e); 
       } 
      } 
     }.start(); 
    client.sendTCP("Hey There"); 

Hier ist der Servercode:

Server server = new Server(); 
    Kryo kryo = server.getKryo(); 
      kryo.register(String.class); 
      server.start(); 
      try { 
       server.bind(54555, 54777); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      server.addListener(new Listener() { 
       public void received (Connection connection, Object object) { 
        if (object instanceof String) { 
         String request = (String)object; 
         System.out.println("Server"+request); 

         String response = "Login succes"; 
         connection.sendTCP(response); 
        } 
       } 
      }); 

ist hier der Fehler, die ich erhalten:

[kryonet] Error updating connection. 
com.esotericsoftware.kryonet.KryoNetException: Incorrect number of bytes (1 remaining) used to deserialize object: null 
    at com.esotericsoftware.kryonet.TcpConnection.readObject(TcpConnection.java:146) 
    at com.esotericsoftware.kryonet.Client.update(Client.java:255) 
    at com.esotericsoftware.kryonet.Client.run(Client.java:338) 
    at java.lang.Thread.run(Unknown Source) 
Exception in thread "Client" com.esotericsoftware.kryonet.KryoNetException: Incorrect number of bytes (1 remaining) used to deserialize object: null 
    at com.esotericsoftware.kryonet.TcpConnection.readObject(TcpConnection.java:146) 
    at com.esotericsoftware.kryonet.Client.update(Client.java:255) 
    at com.esotericsoftware.kryonet.Client.run(Client.java:338) 
    at java.lang.Thread.run(Unknown Source) 
00:05 WARN: expection 
java.net.SocketTimeoutException: Connected, but timed out during TCP registration. 
Note: Client#update must be called in a separate thread during connect. 
    at com.esotericsoftware.kryonet.Client.connect(Client.java:168) 
    at com.esotericsoftware.kryonet.Client.connect(Client.java:117) 
    at me.fort.historywars.LoginScreen$1.run(LoginScreen.java:37) 

Antwort

0

Okay, ich halte diesen Code für fest:

Server:

server = new Server(); 
    Kryo kryo = server.getKryo(); 
    kryo.register(SRq.class); 
    server.start(); 
    try { 
     server.bind(54555, 54777); 
    } catch (Exception e) { 
     System.err.println("Failed to bind to port!"); 
    } 
    server.addListener(new Listener() { 
     @Override 
     public void received(Connection connection, Object object) { 
      if(object instanceof SRq) { 
       System.out.println("Server " + ((SRq) object).data); 
       SRq sRq = new SRq(); 
       sRq.data = "Data"; 
       connection.sendTCP(sRq); 
      } 
     } 
    }); 

Auftraggeber:

client = new Client(); 
    Kryo kryo = client.getKryo(); 
    kryo.register(SRq.class); 
    client.start(); 
    try { 
     client.connect(6000, "localhost", 54555, 54777); 
    } catch (Exception e) { 
     System.err.println("Failed to connect to server!"); 
    } 
    client.addListener(new Listener() { 
     @Override 
     public void received(Connection connection, Object object) { 
      if(object instanceof SRq) { 
       Gdx.app.log("Client", ((SRq) object).data); 
      } 
     } 
    }); 
    System.out.println("Connected to server!"); 

    SRq sRq = new SRq(); 
    sRq.data = "Log in"; 
    client.sendTCP(sRq); 

Dinge im Auge zu behalten:

  • SRq.class ist nur eine Klasse mit einem öffentlichen String Inneren
  • Achten Sie darauf, die Verwendung dieselbe KryoNet-Version sowohl in Ihrem Client als auch in Ihrem Server. Ich habe kryonet-2.21-all verwendet. Laden Sie die Gläser, machen Sie einen Ordner libs in Ihrem Kern Ordner mit dem Namen, setzen Sie das Glas im Inneren, und fügen Sie diese zu Ihrer build.gradle (in Kern Abhängigkeiten): compile fileTree(dir: 'libs', include: '*.jar')
+0

Ich habe versucht zu tun, was Sie vorgeschlagen, aber ich bekomme die gleiche Error. Außerdem habe ich nach 'null' gesucht, aber ich sende keinen 'null' String. Es funktioniert, wenn ich versuche, von einem Client zu verbinden, der nicht Teil einer Libgdx-App ist. Ich bekomme nur den Fehler, wenn der Client in Libgdx ist. – Andy

+0

@Andy verbinden Sie von Desktop oder Android? –

+0

Ich versuche eine Verbindung von Desktop – Andy