сервер kryonet падает при получении объекта

У меня проблема со сбоем сервера Kryonet после получения объекта от клиента. Код сервера:

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();
        }
    }
}

А вот слушатель сервера:

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);
        }
    }
}

А вот файл Packet.java:

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() {

    }

}

Когда пользователь подключается, клиент отправляет Packet0LoginRequest, а сервер отправляет обратно Packet1LoginAnswer. Когда логическая переменная в Packet1LoginAnswer имеет значение true, клиент начинает чтение со сканера и отправку нового Packet2Message. Но сервер падает при получении Packet0LoginRequest.

Вот журнал сбоев: Журнал сбоев сервера


person cookie    schedule 24.05.2016    source источник


Ответы (1)


Он думает, что kryonet не может загрузить ваш конструктор.

Следующий подход работал у меня:

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();
        }
    ...
   }
...
}
person Samuel    schedule 24.05.2016