2016-05-24 9 views
2

Ich habe ein Problem mit Kryonet-Server-Absturz nach Erhalt eines Objekts vom Client. Server Code:Kryonet-Server stürzt ab, wenn ein Objekt empfangen wird

package com.qookie.miner_server; 
import java.io.IOException; 
import com.esotericsoftware.kryo.Kryo; 
import com.esotericsoftware.kryonet.Server; 
import com.esotericsoftware.minlog.Log; 
import com.qookie.miner_server.Packet.*; 


public class MinerServer_Main { 
    private Server server; 

    public MinerServer_Main() throws IOException { 
     this.server = new Server(); 
     RegisterPackets(); 
     server.addListener(new NetworkListener()); 
     server.bind(8888,8888); 
     server.start(); 
    } 

    private void RegisterPackets() { 
     Kryo kryo = server.getKryo(); 
     kryo.register(Packet0LoginRequest.class); 
     kryo.register(Packet1LoginAnswer.class); 
     kryo.register(Packet2Message.class); 

    } 
    public static void main(String[] args) { 
     try { 
      new MinerServer_Main(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Und hier ist ein Server-Listener:

package com.qookie.miner_server; 
import com.esotericsoftware.kryonet.Connection; 
import com.esotericsoftware.kryonet.Listener; 
import com.qookie.miner_server.Packet.*; 

public class NetworkListener extends Listener { 
    public void connected(Connection arg0) { 
     System.out.println("[SERVER] Someone has connected"); 
    } 

    public void disconnected(Connection arg0) { 
     System.out.println("[SERVER] Someone has disconnected"); 
    } 

    public void received(Connection c, Object o) { 
     if (o instanceof Packet0LoginRequest) { 
      Packet1LoginAnswer p = new Packet().new Packet1LoginAnswer(); 
      p.accepted = true; 
      c.sendTCP(p); 
     } 

     if (o instanceof Packet2Message) { 
      String message = ((Packet2Message) o).msg; 
      System.out.println("[CLIENT] " + message); 
     } 
    } 
} 

Und hier ist Packet.java Datei:

package com.qookie.miner_server; 

public class Packet { 
    public class Packet0LoginRequest { 
     public Packet0LoginRequest() {} 
     public void init() { 

     } 
    }; 

    public class Packet1LoginAnswer { 
     public boolean accepted; 
     public Packet1LoginAnswer() {} 
     public void init() { 

     } 
    }; 

    public class Packet2Message { 
     public Packet2Message() {} 
     public String msg; 
     public void init() { 

     } 
    }; 

    public Packet() { 

    } 

} 

Wenn Benutzer eine Verbindung Client sendet eine Packet0LoginRequest und Server sendet zurück Packet1LoginAnswer. Wenn die boolesche Variable in Packet1LoginAnswer wahr ist, beginnt der Client mit dem Lesen vom Scanner und dem Senden neuer Packet2Message. Der Server stürzt jedoch beim Empfang von Packet0LoginRequest ab. Hier

ist das Crash-Protokoll: Server crash log

Antwort

1

Es denken kryonet nicht Ihren Konstruktor zu laden.

Nach Ansatz von mir gearbeitet:

public class Network { 

    static public final int tcpPort = 54555; 
    static public final int udpPort = 54777; 

    // This registers objects that are going to be sent over the network. 
    static public void register (EndPoint endPoint) { 
     Kryo kryo = endPoint.getKryo(); 
     kryo.register(ServerResponse.class); 
     kryo.register(ClientRequest.class); 

    } 

    static public class ServerResponse { 
    ... 
     public ServerResponse(){ 
       super(); 
     } 
... 
    } 

    static public class ClientRequest { 
    ... 
     public ClientRequest(){ 
       super(); 
     } 
    ... 
    } 
... 
}