2014-09-19 6 views
0

Я делаю небольшой проект MMO, и сейчас я работаю над системой входа/регистрации. Всякий раз, когда я пытаюсь отправить ClientLoginPacket, клиент отключается от сервера, и пакет вообще не принимается сервером. Нет следа стека, который появляется, но вот мой код. К сожалению, это очень много, но это все необходимое:Клиент 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); 
} 

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

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. извините за выброс всего этого кода. Обычно я этого не делал, если бы мне этого не нужно. Я поставил как можно меньше. Если вам нужно больше посмотреть, как работает другой материал, и посмотреть, есть ли проблема, просто спросите меня. Благодаря!

+0

У меня также есть эта проблема, есть ли у вас решение? Поделись, пожалуйста. – maohieng

+0

Прошу прощения, это было более года назад. поэтому я не помню решение точно, но я думаю, что он имеет отношение к переменным пакета, которым все должны быть доступны для публики. Кроме того, пакеты должны иметь конструктор по умолчанию без параметров. Kryonet нуждается в том, чтобы сериализовать объекты. – vedi0boy

ответ

0

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

+0

Я понимаю, что это старый вопрос, но я думал, что отправлю ответ всем, у кого проблемы с этим. – cascade256

+0

Без проблем, определенно помогите кому-нибудь когда-нибудь. :) – vedi0boy

+0

Я думаю, что у меня есть проблема ... Я пытаюсь отправить байт [] [] на сервер, он работал все время, пока я не отправил перед байтом другой пакет, теперь Клиент отключается без каких-либо ошибок. .Новые решения? – genaray