Клиент Kryonet отключается после отправки пакета на сервер (java)

Я делаю небольшой ММО-проект и сейчас работаю над системой входа/регистрации. Всякий раз, когда я пытаюсь отправить ClientLoginPacket, клиент отключается от сервера, и сервер вообще не получает пакет. Трассировка стека не отображается, но вот мой код. Извините, что много, но это все необходимо:

КлиентЛогинПакет.java:

package net.vediogames.archipelo.networking.packets;

import net.vediogames.archipelo.networking.Networking;

public class ClientLoginPacket extends Packet{

    private String username;
    private String password;
    private int validity = 0;

    public ClientLoginPacket(String username, String password){
        this.username = username;
        this.password = password;
    }

    public String getUsername(){
        return this.username;
    }

    public String getPassword(){
        return this.password;
    }

    public int getLoginValidity(){
        return validity;
    }

    public void setLoginValidity(int validity){
        this.validity = validity;
    }

    public void send(){
        Networking.sendTCP(this);
    }
}

Это пакет входа. Единственная разница между этим и серверным - это объявление импорта и пакета (его архипелосервер, а не просто архипело). Как видите, этот класс расширяет Packet, вот мой класс Packet:

package net.vediogames.archipelo.networking.packets;

public abstract class Packet {

    protected int connectionID;

    public abstract void send();

    public int getConnectionId(){
        return connectionID;
    }
    public void setConnectionID(int id){
        this.connectionID = id;
    }

}

Все пакеты имеют метод send(), который вызывается для их отправки. Я отправляю свои пакеты следующим образом: new ClientLoginPacket(username, password).send();. В классе ClientLoginPacket вы можете видеть, что он запускает Networking.sentTCP(this) для отправки пакета. Это просто запускает этот код в моем основном классе kryonet Networking.java. Вот код, который он использует для отправки пакетов на стороне клиента:

public static void sendTCP(Packet object){
    client.sendTCP(object);
}

В Крионете вы должны зарегистрировать занятия перед их отправкой. Я сделал это, но я не знаю, правильно ли я это сделал. Вот точный код, который я использовал. Сервер:

private static void setupClasses(){
    Kryo kryo = server.getKryo();
    kryo.register(ClientRegisterPacket.class);
    kryo.register(ClientLoginPacket.class);
    System.out.println("Registered classes.");
}

Клиент:

public static void setupClasses(){
    Kryo kryo = client.getKryo();
    kryo.register(ClientRegisterPacket.class);
    kryo.register(ClientLoginPacket.class);
}

Что я знаю точно, так это то, что у меня есть соединение с сервером перед отправкой пакета, я проверил его с прослушивателем соединения на сервере. Какова будет моя проблема? Что-то не так с моей регистрацией класса? Должны ли оба класса быть полностью идентичными? Заранее спасибо!

p.s. извините, что выкинул весь этот код. Обычно я бы не стал этого делать, если бы мне не пришлось. Ставлю как можно меньше. Если вам нужно больше, чтобы увидеть, как работают другие вещи, и увидеть, есть ли проблема, просто спросите меня. Спасибо!


person vedi0boy    schedule 19.09.2014    source источник
comment
У меня тоже такая проблема, у вас есть решение? Поделись, пожалуйста.   -  person maohieng    schedule 23.01.2016
comment
Извините, это было больше года назад. поэтому я точно не помню решения, но я думаю, что это связано с пакетными переменными, которые должны быть общедоступными. Также пакеты должны иметь конструктор по умолчанию без параметров. Крионету это нужно для сериализации объектов.   -  person vedi0boy    schedule 27.01.2016


Ответы (1)


Kryo нужен конструктор без аргументов для десериализации. Похоже, ваш ClientLoginPacket может понадобиться? Это вызвало проблему и для меня. Только когда я использовал отладочные файлы kryonet на сервере и включил ведение журнала, я получил сообщение об ошибке, объясняющее это.

person cascade256    schedule 29.01.2015
comment
Я понимаю, что это старый вопрос, но я подумал, что опубликую ответ для всех, у кого есть проблемы с этим. - person cascade256; 29.01.2015
comment
Ничего страшного, обязательно кому-нибудь когда-нибудь поможет. :) - person vedi0boy; 31.01.2015
comment
Я думаю, у меня проблема... Я пытаюсь отправить байт [][] на сервер, он работал все время, пока я не отправил перед байтом другой пакет, теперь клиент отключается без каких-либо ошибок... Любые решения ?? - person genaray; 12.03.2016