Java Kryonet [Класс не зарегистрирован, исключение] - PullRequest
2 голосов
/ 23 июля 2011

Я нашел этот API под названием Kryonet .Ну, я попытался реализовать пример, представленный на странице проекта.Однако это не удалось.

Код сервера:

public class KryoTest {

public KryoTest() throws IOException {
    Server server = new Server();
    server.start();
    server.bind(54555, 54777);
    server.addListener(new Listener() {

        public void received(Connection connection, Object object) {
            if (object instanceof SomeRequest) {
                SomeRequest request = (SomeRequest) object;
                System.out.println(request.text);

                SomeResponse response = new SomeResponse();
                response.text = "Thanks!";
                connection.sendTCP(response);
            }
        }
    });
    Kryo kryo = server.getKryo();
    kryo.register(SomeRequest.class);
    kryo.register(SomeResponse.class);
}

public static void main(String[] args) throws IOException {
    new KryoTest();
}}

Код клиента:

    public class Kryoclient {

    public Kryoclient() throws IOException {
    Client client = new Client();
client.start();
client.connect(5000,"192.168.1.4", 54555, 54777);

SomeRequest request = new SomeRequest();
request.text = "Here is the request!";
client.sendTCP(request);

 Kryo kryo = client.getKryo();
kryo.register(SomeRequest.class);
kryo.register(SomeResponse.class);

}
    public static void main(String[] args) throws IOException {
        new Kryoclient();
    }
}

Исключение:

run:
00:00  INFO: Connecting: /192.168.1.4:54555/54777
00:00  INFO: [kryonet] Connection 1 connected: /192.168.1.4
Exception in thread "main" java.lang.IllegalArgumentException: Class is not registered: client.SomeRequest
    at com.esotericsoftware.kryo.Kryo.getRegisteredClass(Kryo.java:319)
    at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:374)
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:484)
    at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:196)
    at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:68)
    at client.Kryoclient.<init>(Kryoclient.java:24)
    at client.Kryoclient.main(Kryoclient.java:30)

Что не так с этим кодом?

Ответы [ 3 ]

9 голосов
/ 23 июля 2011

Я никогда раньше не слышал о Kryonet, но я предполагаю, что вам нужно переместить свои строки kryo.register(...) до того, как клиент или сервер сначала попытаются соединиться или принять соединение соответственно.

1 голос
/ 25 февраля 2013

Порядок кодов должен быть следующим:

// Создать экземпляр сервера

Сервер сервер = новый сервер ();

// Создать экземпляр Kryo из экземпляра сервера и зарегистрировать классы, которые вы собираетесь отправлять через сеть.

Kryo kryo = server.getKryo ();

kryo.register (ClassNameYouWant.class);

// Добавить слушателей

server.addListener (...);

// Порт привязки

server.bind (4345);

// И только теперь запускаем сервер.

сервер.start ();

В своем коде вы запустили сервер перед регистрацией классов и добавлением слушателей.

1 голос
/ 25 июня 2012

Kryoserver - очень хороший многопоточный менеджер клиент-сервер.

Вам необходимо зарегистрировать все классы, отправляемые и получаемые как на клиенте, так и на сервере (в том же порядке), прежде чем подключать клиент и запускать или связывать его с сервером.

...